1.实现基于prometheus联邦收集node的指标数据
1.1 部署prometheus srever 、联邦节点
部署prometheus srever 、联邦节点的方法相同
#下载Prometheus
mkdir /apps
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar xvf prometheus-2.45.0.linux-amd64.tar.gz -C /apps/
ln -sv /apps/prometheus-2.45.0.linux-amd64/ /apps/prometheus
#启动服务
cat >>/etc/systemd/system/prometheus.service <<EOF
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/apps/prometheus/
ExecStart=/apps/prometheus/prometheus --config.file=/apps/prometheus/prometheus.yml --web.enable-lifecycle
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start prometheus && systemctl enable prometheus
#检查服务
# ss -ntpl|grep 9090
LISTEN 0 4096 *:9090 *:* users:(("prometheus",pid=1205826,fd=7))
1.2 部署node_exporter
#下载node_exporter
mkdir /apps
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvf node_exporter-1.6.1.linux-amd64.tar.gz -C /apps/
ln -sv /apps/node_exporter-1.6.1.linux-amd64/ /apps/node_exporter
#启动服务
cat >>/etc/systemd/system/node-exporter.service <<EOF
[Unit]
Description=Prometheus Node Exporter
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
ExecStart=/apps/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start node-exporter.service
#检查服务
# ss -ntpl |grep 9100
LISTEN 0 4096 *:9100 *:* users:(("node_exporter",pid=63519,fd=3))
1.3 配置联邦节点
#直接在配置文件最后添加
#联邦节点1
vim /apps/prometheus/prometheus.yml
......
- job_name: "node"
static_configs:
- targets: ["172.20.20.202:9100"]
#联邦节点2
vim /apps/prometheus/prometheus.yml
......
- job_name: "node"
static_configs:
- targets: ["172.20.20.203:9100"]
验证
1.4 Prometheus server采集联邦节点
#直接在配置文件最后添加
- job_name: 'prometheus-federate-91'
scrape_interval: 10s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
- '{__name__=~"node.*"}'
static_configs:
- targets:
- '172.20.20.91:9090'
- job_name: 'prometheus-federate-92'
scrape_interval: 10s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
- '{__name__=~"node.*"}'
static_configs:
- targets:
- '172.20.20.92:9090'
- job_name: 'prometheus-k8s-federate-111'
scrape_interval: 10s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
- '{__name__=~"node.*"}'
static_configs:
- targets:
- '172.20.20.111:39090'
验证
2.总结prometheus单机存储、实现victoriametrics单机远程存储
2.1 prometheus单机存储
Prometheus有着非常高效的时间序列数据存储方法,每个采样数据仅仅占用3.5byte左右空间,上百万条时间序列,30秒间隔,保留60天,大概200多G空间。
2.1.1 本地存储简介
默认情况下,prometheus将采集到的数据存储在本地的TSDB数据库中,路径默认为prometheus安装目录的data目录,数据写入过程为先把数据写入wal日志并放在内存,然后2小时后将内存数据保存至一个新的block块,同时再把新采集的数据写入内存并在2小时后再保存至一个新的block 块,以此类推。
2.1.2 block简介
每个block为一个data目录中以01开头的存储目录
2.1.3 block特性
block会压缩、合并历史数据块,已经删除过期的块,随着压缩、合并,block的数量会减少,在压缩过程中会发生三件事:定期执行压缩、合并小的block到大的block、清理过期的块。
每个块有4部分组成:
# tree /apps/prometheus/data/01HC6TGHNR4V2ZTAN2K6XTY0MQ
/apps/prometheus/data/01HC6TGHNR4V2ZTAN2K6XTY0MQ
├── chunks
│ └── 000001 #数据目录每个大小为512MB超过会被切分为多个
├── index #索引文件,记录存储的数据的索引信息,通过文件内的几个表来查找时序数据
├── meta.json #block元数据信息,包含了样本数、采集数据的起始时间、压缩历史
└── tombstones #逻辑数据,主要记载删除记录和标记要删除的内客,删除标记,可在查询块时排除样本。
1 directory, 4 files
2.1.4 本地存储配置参数
--config.file="prometheus.yml" #指定配置文件
--web.listen-address="0.0.0.0:9090" #指定监听地址
--storage.tsdb.path="data/" #指定数存储目录
--storage.tsdb.retention.size=Bl KB,MB,GB,TB,PB,EB #指定chunk 大小,默认512MB
--storage.tsdb.retention.time= #数据保存时长,默认15天
--query.timeout=2m #最大查询超时时间
-query.max-concurrency=20 #最大查询并发数
--web.read-timeout=5m #最大空闲超时时间
--web.max-connections=512 #最大并发连接数
--web.enable-lifecycle #启用API动态加载配置功能
2.2 victoriaMetrics单机远程存储
2.2.1 安装victoriaMetrics
#下载
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.93.5/victoria-metrics-linux-amd64-v1.93.5.tar.gz
tar xvf victoria-metrics-linux-amd64-v1.93.5.tar.gz
mv victoria-metrics-prod /usr/local/bin/
#启动
cat >> /etc/systemd/system/victoria-metrics-prod.service <<EOF
[Unit]
Description=For Victoria-metrics-prod Service
After=network.target
[Service]
ExecStart=/usr/local/bin/victoria-metrics-prod -httpListenAddr=0.0.0.0:8428 -storageDataPath=/data/victoria -retentionPeriod=3
[Install]
WantedBy=multi-user.target
EOF
systemctl start victoria-metrics-prod.service
#检查
# ss -ntpl |grep 8428
LISTEN 0 32768 0.0.0.0:8428 0.0.0.0:* users:(("victoria-metric",pid=451700,fd=7))
参数
-httpListenAddr=O.0.0.0:8428 #监听地址及端口
-storageDataPath #VictoriaMetrics将所有数据存储在此目录中,默认为执行启动victoria的当前目录下的victoria-metrics-data目录中。
-retentionPeriod #存储数据的保留,较旧的数据会自动删除,默认保留期为1个月,默认单位为m(月),支持的单位有h (hour), d (day), w (week),y (year)。
2.2.2 配置Prometheus
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
#单机配置
remote_write:
- url: http://172.20.20.121:8428/api/v1/write
2.2.3 验证数据
2.2.4 grafana查看
添加数据源
导入模版查看 模版11074
3.实现prometheus 基于victoriametrics 集群远程存储
3.1 集群架构
#组件说明
vminsert
写入组件(写),vminsert负责接收数据写入,并根据对度量名称及其所有标签的一致hash结果将数据分散写入不同的后端vmstorage节点,vminsert默认端口8480
vmstroage
存储原始数据并返回给定时间范围内给定标签过滤器的查询数据,默认端口8482
vmselect
查询组件(读),连接vmstorage,默认端口8481
vmagent
是一个很小但功能强大的代理,它可以从node_exporter各种来源收集度量数据,并将它们存储在VictoriaMetrics或任何其他支持远程写入协议的与 prometheus兼容的存储系统中,有替代prometheus server的意向。
vmalert
替代Prometheus server,以VictoriaMetrics为数据源,基于兼容Prometheus的告警规则,判断数据是否异常,并将产生的通知发送给alertmanager
vmgateway
读写VictoriaMetrics数据的代理网关,可实现限速和访问控制等功能,目前为企业组件
vmctl
VictoriaMetrics的命令行工具,目前主要用于将prometheus,opentsdb等数据源的数据迁移到VictoriaMetrics
3.2 部署服务
准备主机vm1 172.20.20.121
vm2172.20.20.122
vm3 172.20.20.123
,各节点后面操作相同
#下载
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.93.5/victoria-metrics-linux-amd64-v1.93.5-cluster.tar.gz
tar xvf victoria-metrics-linux-amd64-v1.93.5-cluster.tar.gz
mv vm* /usr/local/bin/
#启动服务
#vmstorage-prod 负责数据的持久化,监控端口:API 8482,数据写入端口:8400,数据读取端口:8401
cat >> /etc/systemd/system/vmstorage.service <<EOF
[Unit]
Description=Vmstorage Server
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/vmstorage-prod -loggerTimezone=Asia/Shanghai -storageDataPath=/data/vmstorage-data -httpListenAddr=:8482 -vminsertAddr=:8400 -vmselectAddr=:8401
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable vmstorage.service && systemctl start vmstorage.service
#vminsert-prod 接收外部的写请求,默认端口8480
cat >> /etc/systemd/system/vminsert.service <<EOF
[Unit]
Description=Vminsert Server
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/vminsert-prod -httpListenAddr=:8480 -storageNode=172.20.20.121:8400,172.20.20.122:8400,172.20.20.123:8400
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable vminsert.service && systemctl start vminsert.service
#vmselect-prod 负责接收外部的读请求,默认端口8481
cat >> /etc/systemd/system/vmselect.service <<EOF
[Unit]
Description=Vmselect Server
After=network.target
[Service]
Restart=on-failure
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/vmselect-prod -httpListenAddr=:8481 -storageNode=172.20.20.121:8401,172.20.20.122:8401,172.20.20.123:8401
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable vmselect.service && systemctl start vmselect.service
#检查服务,三个节点启动的端口都是一样的
# ss -ntpl|grep 84
LISTEN 0 32768 0.0.0.0:8480 0.0.0.0:* users:(("vminsert-prod",pid=453812,fd=3))
LISTEN 0 32768 0.0.0.0:8481 0.0.0.0:* users:(("vmselect-prod",pid=453776,fd=8))
LISTEN 0 32768 0.0.0.0:8482 0.0.0.0:* users:(("vmstorage-prod",pid=453799,fd=60))
LISTEN 0 32768 0.0.0.0:8400 0.0.0.0:* users:(("vmstorage-prod",pid=453799,fd=58))
LISTEN 0 32768 0.0.0.0:8401 0.0.0.0:* users:(("vmstorage-prod",pid=453799,fd=59))
可以网页访问三个节点的8480
8481
8482
的metrics查看是否启动成功
3.3 配置Prometheus
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
#集群配置
remote_write:
- url: http://172.20.20.121:8480/insert/0/prometheus
- url: http://172.20.20.122:8480/insert/0/prometheus
- url: http://172.20.20.123:8480/insert/0/prometheus
3.4 grafana查看
配置数据源,数据采集地址http://172.20.20.122:8481/select/0/prometheus可以通过HA做高可用
导入模版13824
3.5 开启数据复制
https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#replication-and-data-safety
默认情况下,数据被vminsert的组件基于hash算法分别将数据持久化到不同的vmstroage节点,可以启用vminsert组件支持的-replicationFactor=N(N为节点数)复制功能,将数据分别在各节点保存一份完整的副本以实现数据的高可用。
4.skywalking 架构整理、docker-compsoe安装、skywalking实现收集java博客追踪案例
4.1 skywalking 架构整理
4.1.1 skywalking 特点
- 实现从请求跟踪、指标收集和日志记录的完整信息记录。
- 多语言自动探针,支持Java、GO、Python、PHP、NodeJS、LUA、Rust等客户端。
- 内置服务网格可观察性,支持从Istio+Envoy Service Mesh收集和分析数据。
- 模块化架构,存储、集群管理、使用插件集合都可以进行自由选择。
- 支持告警。
- 优秀的可视化效果
4.1.2 skywalking 组件
组件介绍
- OAP平台(Observability Analysis Platform,可观测性分析平台)或OAP Server,它是一个高度组件化的轻量级分析程序,由兼容各种探针Receiver、流式分析内核和查询内核三部分构成。
- 探针:基于无侵入式的收集,并通过HTTP或者gRPC方式发送数据到OAP Server。
- 存储实现(Storage Implementors),SkyWalking OAP Server支持多种存储实现并且提供了标准接口,可支持不同的存储后端。
- UI模块(SkyWalking),通过标准的GraphQL(Facebook在2012年开源)协议进行统计数据查询和展示 。
4.1.3 设计模式:
- 面向协议设计:面向协议设计是SkyWalking从5.x开始严格遵守的首要设计原则,组件之间使用标准的协议进行数据交互。
- 协议有探针协议和查询协议
4.1.4 探针协议
- 探针上报协议:协议包括语言探针的注册、Metrics数据上报、Tracing数据据上报等标准,Java、Go等探针都需要严格遵守此协议的标准。
- 探针交互协议:因为分布式追踪环境,探针间需要借助HTTP Header、MQ Header在应用之间进行通信和交互,探针交互协议就定义了交互的数据格式。
- Service Mesh协议:是SkyWalking对Service Mesh抽象的专有协议,任何Mesh类的服务都可以通过此协议直接上传指标数据,用于计算服务的指标数据和绘制拓扑图。
- 第三方协议: 对大型的第三方开源项目 尤其是Service Mesh核心平台Istio和Envoy,提供核心协议适配,支持针对Istio+Envoy Service Mesh进行无缝对接。
4.1.5 数据查询协议:
- 元数据查询:查询在SkyWalking注册的服务、服务实例、Endpoint等元数据信息。
- 拓扑关系查询:查询全局、或者单个服务、Endpoint的拓扑图及依赖关系。
- Metrics指标查询: 查询指标数据。
- 聚合指标查询:区间范围均值查询及Top N排名数据查询等。
- Trace查询:追踪数据的明细查询。
- 告警查询:基于表达式,判断指标数据是否超出阈值。
4.1.6 skywalking设计
模块化设计:
1. 探针收负责集数据
2. 前端负责展示数据
3. 后端负责从后端存储读写数据
4. 后端存储负责持久化数据轻量化设计:
SkyWalking在设计之初就提出了轻量化的设计理念,SkyWalking使用最轻量级的jar包模式,实现强大的数据处理和分析能力、可扩展能力和模块化能力。
4.1.7 skywalking优势
- 兼容性好:支持传统的开发框架dubbo和spring cloud,也支持云原生中的Istio和envoy。
- 易于部署和后期维护:组件化,可以自定义部署,后期横向扩容简单
- 高性能:每天数T的数据无压力
- 易于二次开发:标准的http和grpc协议,开源的项目,企业可以自主二次开发
4.2 部署skywalking
4.2.1 通过docker-compsoe安装,服务器提前准备docker环境
#准备yaml文件
version: '3.3'
services:
es7:
image: elasticsearch:7.10.1
container_name: es7
ports:
- 9200:9200
- 9300:9300
environment:
- discovery.type=single-node #单机模式
- bootstrap.memory_lock=true #锁定物理内存地址
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #堆内存大小
- TZ=Asia/Shanghai
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /data/elasticsearch/data:/usr/share/elasticsearch/data
skywalking-oap:
image: apache/skywalking-oap-server:8.6.0-es7
container_name: skywalking-oap
restart: always
depends_on:
- es7
links:
- es7
ports:
- 11800:11800
- 12800:12800
environment:
TZ: Asia/Shanghai
SW_STORAGE: elasticsearch7
SW_STORAGE_ES_CLUSTER_NODES: es7:9200
skywalking-ui:
image: apache/skywalking-ui:8.6.0
container_name: skywalking-ui
restart: always
depends_on:
- skywalking-oap
links:
- skywalking-oap
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
SW_OAP_ADDRESS: skywalking-oap:12800
#创建数据目录
mkdir -p /data/elasticsearch/data
chmod 777 /data/elasticsearch/data -R
#启动
docker-compose up -d
#检查
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47fe9ffdff0d apache/skywalking-ui:8.6.0 "bash docker-entrypo…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp skywalking-ui
25791232a47c apache/skywalking-oap-server:8.6.0-es7 "bash docker-entrypo…" 6 seconds ago Up 5 seconds 0.0.0.0:11800->11800/tcp, :::11800->11800/tcp, 1234/tcp, 0.0.0.0:12800->12800/tcp, :::12800->12800/tcp skywalking-oap
41a9622a1d36 elasticsearch:7.10.1 "/tini -- /usr/local…" 7 seconds ago Up 5 seconds 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp es7
4.2.1 检查web页面
4.3 skywalking实现收集java博客追踪案例
4.3.1 准备环境和安装服务
#准备java运行环境
apt install openjdk-11-jdk -y
#下载项目
cd /apps
curl -L https://github.com/halo-dev/halo/releases/download/v1.5.4/halo-1.5.4.jar --output halo.jar
wget https://archive.apache.org/dist/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz
tar xf apache-skywalking-java-agent-8.8.0.tgz
#修改skywalking-agent配置文件
# vim config/agent.config
18 agent.namespace=${SW_AGENT_NAMESPACE:halo }
21 agent.service_name=${SW_AGENT_NAME:halo}
93 collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:172.20.20.211:11800}
#启动
java -javaagent:/apps/skywalking-agent/skywalking-agent.jar -jar /apps/halo-1.6.1.jar
4.3.2 查看web网页
4.3.3 查看skywalking监控界面
4.3.4 skywalking仪表盘简介
- global: 显示服务的全局统计详情。
- 服务(Service)-表示对请求提供相同行为的一系列或一组工作负载(服务名称),在使用Agent或SDK的时候,可以自定义服务的名字,如果不定义的话,SkyWalking将会使用你在平台(例如说 Istio)上定义的名字。
- 服务实例(Instance)-上述的一组工作负载中的每一个工作负载称为一个实例(一个服务运行的节点),一个服务实例可以是一个kubernetes中的pod或者是一个虚拟机甚至是物理机 。
- 端点(Endpoint) : 对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类 +方法签名, 如/api/v1/
4.3.4.1 skywalking仪表盘-global简介
- CPM-calls per minute: 服务平均每分钟请求数
- Slow Services ms: 慢响应服务, 单位ms
- Un-Health services(Apdex): Apdex 性能指标, 1为满分
- Slow Endpoints(ms): 全局维度的慢响应端点(API),例如一个接口, 显示的是全局慢响应Top N的数据,通过这个可以观测平台性能情况。
- Global Response Latency(percentile inms): 全局响应延迟百分位数统计, 单位ms。
- Global Heatmap: 服务响应时间热力分布图, 根据当时时间段内不同响应时间(0ms、 100ms)的数量用不同的颜色表示。
4.3.4.2 skywalking仪表盘-service简介
- Service Apdex(数字) :当前服务的评分
- Service Apdex(折线图) : 一段时间内Apdex评分
- Service Avg Response Times(ms) : 平均响应延时,单位ms
- Service Response Time Percentile: 百分比响应延时,参考Global Response Latency(percentile in ms)
- Successful Rate(数字) : 请求成功率
- Successful Rate(折线图) : 一段时间的请求成功率
- Servce Load(CPM / PPM) (数字) : 每分钟请求数,
- Servce Load(CPM / PPM) (折线图) : 不同时间的每分钟请求数
- Service Throughput (Bytes) : 该指标只适用于TCP 服务。 当前服务的吞吐量。
- Servce Instances Load(CPM / PPM) : 每个服务实例的每分钟请求数
- Show Service Instance: 每个 服务 实例 的最大延时
- Service Instance Successful Rate: 每个服务实例的请求成功率
4.3.4.3 skywalking仪表盘-instance简介
- Service Instance Load (CPM / PPM) : 当前实例的每分钟请求数。
- Service Instance Throughput (Bytes) : 该指标只适用于TCP 服务,显示当前服务实例的吞吐量。
- Service Instance Successful Rate(%) : 当前实例的请求成功率。
- Service Instance Latency(ms) : 当前实例的响应延时。
- JVM CPU(Java Service) : jvm占用CPU的百分比。
- JVM Memory (Java Service): JVM内存占用大小, 单位m, 包括堆内存, 与堆外内存(直接内存) 。
- JVM GC Time(ms) : JVM垃圾回收时间, 包含YGC和OGC。
- JVM GC Count: JVM垃圾回收次数, 包含YGC和OGC
- JVM Thread Count (Java Service)。
4.3.4.4 skywalking仪表盘-endpoint简介
端点整体统计:
- Endpoint Load in Current Service(CPM /PPM) : 每个端点(API) 每分钟请求数
- Slow Endpoints in Current Service(ms) :每个端点(API) 的最慢响应请求时间, 单位ms
- Successful Rate in Current Service(%) :每个端点(API) 的请求成功率
当前端点统计:
- Endpoint Load: 当前端点每个时间段的请求数据
- Endpoint Avg Response Time: 当前端点每个时间段的请求行响应时间
- Endpoint Response Time Percentile(ms) :当前端点每个时间段的响应时间占比
- Endpoint Successful Rate(%) : 当前端点每个时间段的请求成功率
4.3.4.5 skywalking仪表盘-database简介
- Database Avg Response Time(ms) : 当前数据库事件平均响应时间, 单位ms
- Database Access Successful Rate(%) :当前数据库访问成功率
- Database Traffic(CPM: Calls PerMinute) : 当前数据库每分钟请求数
- Database Access Latency Percentile(ms) : 数据库不同比例的响应时间, 单位ms
- Slow Statements(ms) : 前N个慢查询,单位ms
- All Database Loads(CPM: Calls PerMinute) : 所有数据库中请求量排序
- Un-Health Databases: 所有数据库不健康排名, 请求成功率排名, 失败最多的请求在最上。
4.3.4.6 skywalking仪表盘-拓扑图
4.3.4.7 skywalking仪表盘-追踪
5. skywalking 实现基于nginx+java服务的全链路数据收集
5.1 安装监控基于tomcat运行jenkins java程序服务
5.1.1 部署服务
#准备环境
apt-get update && apt install openjdk-11-jdk -y
#下载相关安装包
cd /apps
wget https://archive.apache.org/dist/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz
tar xf apache-skywalking-java-agent-8.8.0.tgz
wget https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.94/bin/apache-tomcat-8.5.94.tar.gz
tar xvf apache-tomcat-8.5.94.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/war/2.426/jenkins.war
mv jenkins.war apache-tomcat-8.5.94/webapps/
#修改相关配置
# vim /apps/skywalking-agent/config/agent.config
...
18 agent.namespace=${SW_AGENT_NAMESPACE:jenkins}
21 agent.service_name=${SW_AGENT_NAME:jenkins}
93 collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:172.20.20.211:11800}
# vim /apps/apache-tomcat-8.5.94/bin/catalina.sh
...
125
126 CATALINA_OPTS="$CATALINA_OPTS -javaagent:/apps/skywalking-agent/skywalking-agent.jar"
127 # OS specific support. $var _must_ be set to either true or false.
128 cygwin=false
129 darwin=false
#启动服务
/apps/apache-tomcat-8.5.94/bin/catalina.sh run
#查看端口
# ss -ntpl |grep java
LISTEN 0 1 [::ffff:127.0.0.1]:8005 *:* users:(("java",pid=58207,fd=266))
LISTEN 0 100 *:8080 *:* users:(("java",pid=58207,fd=161))
5.1.2 检查jenkins
http://172.20.20.212:8080/jenkins/
5.1.3 查看skywalking server端是否有新数据
5.2 部署监控nginx服务
#部署前,准备下环境
apt -y install make gcc libpcre3 libpcre3-dev openssl libssl-dev zlib1g-dev
5.2.1 编译安装luajit
wget https://github.com/openresty/luajit2/archive/refs/tags/v2.1-20230410.tar.gz
tar xvf v2.1-20230410.tar.gz
cd luajit2-2.1-20230410/
make install PREFIX=/usr/local/luajit2-2.1
#配置环境变量
# vim /etc/profile
#添加到文件末尾
export LUAJIT_LIB=/usr/local/luajit2-2.1/lib
export LUAJIT_INC=/usr/local/luajit2-2.1/include/luajit-2.1
# source /etc/profile
#加载luajit2模块,nginx启动需要调用libuajit-5.1.so.2模块
# vim /etc/ld.so.conf.d/libc.conf
/usr/local/lib
/usr/local/luajit2-2.1/lib/
#动态加载
ldconfig
5.2.2 编译安装lua核心库,nginx需要加载lua库
#编译安装lua-resty-core库
wget https://github.com/openresty/lua-resty-core/archive/refs/tags/v0.1.26.tar.gz
mv v0.1.26.tar.gz lua-resty-core-v0.1.26.tar.gz
tar xvf lua-resty-core-v0.1.26.tar.gz
cd lua-resty-core-0.1.26/
make install PREFIX=/usr/local/luacore
#编译安装lua-resty-lrucache库
wget https://github.com/openresty/lua-resty-lrucache/archive/refs/tags/v0.13.tar.gz
mv v0.13.tar.gz lua-resty-lrucache-v0.13.tar.gz
tar xvf lua-resty-lrucache-v0.13.tar.gz
cd lua-resty-lrucache-0.13/
make install PREFIX=/usr/local/luacore
5.2.3 编译安装lua-cjson库
wget https://github.com/mpx/lua-cjson/archive/refs/tags/2.1.0.tar.gz
mv 2.1.0.tar.gz lua-cjson-2.1.0.tar.gz
tar xvf lua-cjson-2.1.0.tar.gz
cd lua-cjson-2.1.0/
#修改编译文件
# vim Makefile #修改21行内容
22 LUA_INCLUDE_DIR = /usr/local/luajit2-2.1/include/luajit-2.1
# vim lua_cjson.c #修改1298行内容
1298 void luaL_setfuncs (lua_State *l, const luaL_Reg *reg, int nup)
#编译,有报错,但不影响
# make
cc -c -O3 -Wall -pedantic -DNDEBUG -I/usr/local/luajit2-2.1/include/luajit-2.1 -fpic -o lua_cjson.o lua_cjson.c
In file included from lua_cjson.c:47:
fpconv.h:15:20: warning: inline function ‘fpconv_init’ declared but never defined
15 | extern inline void fpconv_init();
| ^~~~~~~~~~~
cc -c -O3 -Wall -pedantic -DNDEBUG -I/usr/local/luajit2-2.1/include/luajit-2.1 -fpic -o strbuf.o strbuf.c
cc -c -O3 -Wall -pedantic -DNDEBUG -I/usr/local/luajit2-2.1/include/luajit-2.1 -fpic -o fpconv.o fpconv.c
cc -shared -o cjson.so lua_cjson.o strbuf.o fpconv.o
# make install
mkdir -p //usr/local/lib/lua/5.1
cp cjson.so //usr/local/lib/lua/5.1
chmod 755 //usr/local/lib/lua/5.1/cjson.so
5.2.4 准备ngx_devel_kit源码
wget https://github.com/vision5/ngx_devel_kit/archive/refs/tags/v0.3.2.tar.gz
mv v0.3.2.tar.gz ngx_devel_kit-v0.3.2.tar.gz
tar xvf ngx_devel_kit-v0.3.2.tar.gz
5.2.5 准备lua-nginx-module源码
wget https://github.com/openresty/lua-nginx-module/archive/refs/tags/v0.10.24.tar.gz
mv v0.10.24.tar.gz lua-nginx-module-v0.10.24.tar.gz
tar xvf lua-nginx-module-v0.10.24.tar.gz
5.2.6 编译安装nginx
# wget https://nginx.org/download/nginx-1.22.0.tar.gz
# tar xvf nginx-1.22.0.tar.gz
# cd nginx-1.22.0/
# mkdir /apps
# ./configure --prefix=/apps/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--add-module=../ngx_devel_kit-0.3.2 \
--add-module=../lua-nginx-module-0.10.24
# make && make install
#验证lua环境
# vim /apps/nginx/conf/nginx.conf
...
http {
#在http段下添加
lua_package_path "/usr/local/luacore/lib/lua/?.lua;;";
}
#在server段下面添加
location /hello {
default_type text/html;
content_by_lua_block {
ngx.say("Hello Lua!")
}
}
访问
5.2.7 部署skywalking-nginx客户端
cd /apps
wget https://github.com/apache/skywalking-nginx-lua/archive/refs/tags/v0.6.0.tar.gz
tar xvf v0.6.0.tar.gz
#准备lua-tablepool库(没有此库,访问无法显示)
# git clone https://github.com/openresty/lua-tablepool.git
# cp lua-tablepool/lib/tablepool.lua /apps/skywalking-nginx-lua-0.6.0/lib/
或
# wget https://github.com/openresty/lua-tablepool/archive/refs/tags/v0.02.tar.gz
# tar -xf lua-tablepool-0.02.tar.gz
# cp lua-tablepool-0.02/lib/tablepool.lua /apps/skywalking-nginx-lua-0.6.0/lib/
准备nginx配置文件并启动
# vim /apps/nginx/conf/nginx.conf # 加载lua,配置收集数据
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
lua_package_path "/usr/local/luacore/lib/lua/?.lua;/apps/skywalking-nginx-lua-0.6.0/lib/?.lua;;";
sendfile on;
keepalive_timeout 65;
include /apps/nginx/conf/conf.d/*.conf;
}
# vim /apps/nginx/conf/conf.d/myserver.conf
# lua_package_path "/usr/local/luacore/lib/lua/?.lua;/apps/skywalking-nginx-lua-0.6.0/lib/?.lua;;"; #该配置在之前http段配置了,这里不用配置
lua_shared_dict tracing_buffer 100m;
init_worker_by_lua_block {
local metadata_buffer = ngx.shared.tracing_buffer
metadata_buffer:set('serviceName', 'myserver-nginx')
metadata_buffer:set('serviceInstanceName', 'skywalking-agent-02')
metadata_buffer:set('includeHostInEntrySpan', false)
require("skywalking.util").set_randomseed()
require("skywalking.client"):startBackendTimer("http://172.20.20.211:12800")
skywalking_tracer = require("skywalking.tracer")
}
server {
listen 80;
server_name www.myserver.com;
location /jenkins {
default_type text/html;
rewrite_by_lua_block {
skywalking_tracer:start("www.myserver.com")
}
proxy_pass http://172.20.20.212:8080/jenkins;
body_filter_by_lua_block {
if ngx.arg[2] then
skywalking_tracer:finish()
end
}
log_by_lua_block {
skywalking_tracer:prepareForReport()
}
}
location / {
default_type test/html;
root html;
rewrite_by_lua_block {
skywalking_tracer:start("local")
}
body_filter_by_lua_block {
if ngx.arg[2] then
skywalking_tracer:finish()
end
}
log_by_lua_block {
skywalking_tracer:prepareForReport()
}
}
}
# nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
# nginx -s reload