前言

🔜什么是SkyWalking?🔚

是一款优秀的国产 APM 工具。

分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。

提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

SkyWalking架构分为UI、OAP、存储、探针4部分。

其中UI为SkyWalking UI :负责提供控台、查看链路等等;(可视化显示)

OAP为SkyWalking OAP :负责接收 Agent(探针) 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。(数据分析)

存储为Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。(存储数据)

探针为 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器。(收集数据)

环境准备

(1)使用脚本安装docker、docker-compose

1
bash <(curl -sSL https://linuxmirrors.cn/docker.sh)

(2)配置镜像加速

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
vi /etc/docker/daemon.json

{
"data-root": "/data/dockerData",
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com",
"https://huecker.io",
"https://docker.rainbond.cc",
"https://dockerhub.timeweb.cloud",
"https://dockerhub.icu",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://docker.kubesre.xyz"],
"log-driver":"json-file",
"log-opts":{"max-size" :"50m","max-file":"3"}
}

(3)启动docker服务

1
2
3
systemctl start docker
systemctl enable docker
systemctl status docker

(4)设置与内存映射相关的内核参数为262144,查看应用到系统的内核参数。

1
2
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
sysctl -p

部署步骤

(1)创建部署文件所需的存储目录

1
2
mkdir -p /data/elasticsearch/data /data/elasticsearch/logs /data/skywalking/oap
chmod -R 777 /data/elasticsearch

(2)创建临时skywalking-oap-server容器,将skywalking配置文件拷贝到映射目录中。

1
2
3
4
5
cd /data/skywalking/oap
# 创建临时skywalking-oap-server容器,拷贝skywalking配置文件到主机目录
docker run -itd --name=oap-temp apache/skywalking-oap-server:9.5.0
docker cp oap-temp:/skywalking/config/. .
docker rm -f oap-temp

(3)修改skywalking的配置文件application.yml,将elasticsearch作为数据存储。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vi application.yml

storage:
selector: ${SW_STORAGE:elasticsearch} #将h2修改为elasticsearch
elasticsearch:
namespace: ${SW_NAMESPACE:""}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:本机ip:9200} #localhost修改为主机ip
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
connectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:3000}
socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000}
responseTimeout: ${SW_STORAGE_ES_RESPONSE_TIMEOUT:15000}
numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0}
user: ${SW_ES_USER:"elastic"} #填写es的账号
password: ${SW_ES_PASSWORD:"elastic"} #填写es密码
trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:""}
trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:""}

(4)创建docker-compose文件,编排部署skywalking、es、skywalking-ui。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
vi skywalking.yml

services:
elasticsearch:
image: elasticsearch:8.15.0
container_name: elasticsearch
restart: always
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms1g -Xmx1g
- ELASTIC_PASSWORD=elastic
- TZ=Asia/Shanghai
ports:
- "9200:9200"
- "9300:9300"
healthcheck:
test: [ "CMD-SHELL", "curl --silent --fail -u elastic:elasitc localhost:9200/_cluster/health || exit 1" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
volumes:
- /data/elasticsearch/data:/usr/share/elasticsearch/data
- /data/elasticsearch/logs:/usr/share/elasticsearch/logs
- /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins
networks:
skywalking-network:
ipv4_address: 172.20.110.11
ulimits:
memlock:
soft: -1
hard: -1

skywalking-oap:
image: apache/skywalking-oap-server:9.5.0
container_name: skywalking-oap
restart: always
ports:
- "11800:11800"
- "12800:12800"
- "1234:1234"
healthcheck:
test: [ "CMD-SHELL", "/skywalking/bin/swctl health" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
depends_on:
elasticsearch:
condition: service_healthy
environment:
- SW_STORAGE=elasticsearch
- SW_HEALTH_CHECKER=default
- TZ=Asia/Shanghai
- JVM_Xms=512M
- JVM_Xmx=1024M
- SW_STORAGE_ES_CLUSTER_NODES=本机ip:9200
volumes:
- /data/skywalking/oap:/skywalking/config
networks:
skywalking-network:
ipv4_address: 172.20.110.12


skywalking-ui:
image: apache/skywalking-ui:9.5.0
container_name: skywalking-ui
restart: always
environment:
- SW_OAP_ADDRESS=http://本机ip:12800
- SW_ZIPKIN_ADDRESS=http://本机ip:9412
- TZ=Asia/Shanghai
ports:
- "8080:8080"
depends_on:
skywalking-oap:
condition: service_healthy
networks:
skywalking-network:
ipv4_address: 172.20.110.13

networks:
skywalking-network:
driver: bridge
ipam:
config:
- subnet: 172.20.110.0/24
1
docker compose -f skywalking.yml up -d

Skywalking可通过以下两种方式连接es,作为存储。(使用其中一种即可)

Skywalking 通过 HTTP认证连接 Elasticsearch

1
2
3
4
5
#关闭es的ssl证书认证
docker exec -it elasticsearch bash -c ' sed -i "s/ enabled: true/ enabled: false/g" /usr/share/elasticsearch/config/elasticsearch.yml'
docker exec -it elasticsearch bash -c 'cat /usr/share/elasticsearch/config/elasticsearch.yml'
docker restart elasticsearch
docker restart skywalking-oap

Skywalking 通过 HTTPS SSL 认证连接 Elasticsearch

(1)将es的crt和key证书文件,转化为p12格式

1
openssl pkcs12 -export -in ca.crt -inkey ca.key -out es.p12 -name esca -CAfile es.crt

输入两次keypass,其中-name参数为别名。

openssl pkcs12 -export -in ca.crt -inkey ca.key -out es.p12 -name esca -CAfile es.crt
Enter Export Password:
Verifying - Enter Export Password:

(2)将p12格式证书转化为jks证书

安装JDK。keytool 是 JDK 中的一部分,需要安装JDK,进行证书转化操作。

1
yum install - java-11-openjdk-devel

storepass 参数为jks证书密码,srcstorepass参数为p12证书密码。

1
keytool -importkeystore -v -srckeystore es.p12 -srcstoretype PKCS12  -srcstorepass wasd2345  -deststoretype JKS -destkeystore es.jks -storepass qiswasd2345

storage:
selector: ${SW_STORAGE:elasticsearch}
elasticsearch:
namespace: ${SW_NAMESPACE:””}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:es所在服务器地址:443}
protocol: 443${SW_STORAGE_ES_HTTP_PROTOCOL:”https“}
connectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:3000}
socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000}
responseTimeout: ${SW_STORAGE_ES_RESPONSE_TIMEOUT:15000}
numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0}
user: ${SW_ES_USER:”es用户名“}
password: ${SW_ES_PASSWORD:”es密码“}
trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:”jks证书地址“}
trustStorePass: </mark>${SW_STORAGE_ES_SSL_JKS_PASS:”jks证书密码“}

开启Linux监控

安装Prometheus node-exporter从 VM 收集指标数据。(源码方式)

1
2
3
4
5
6
7
yum install -y wget
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar -xvzf node_exporter-1.8.2.linux-amd64.tar.gz
cd
mv node_exporter-1.8.2.linux-amd64/node_exporter /usr/sbin/
cd /usr/sbin/
./node_exporter

验证是否运行

1
curl http://localhost:9100/metrics

创建node_exporter服务文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vi /usr/lib/systemd/system/node_exporter.service

[Unit]
Description=node exporter service
Documentation=https://prometheus.io
After=network.target

[Service]
Type=simple
User=root
Group=root
#node_exporter的存放位置
ExecStart=/usr/sbin/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target

重新加载系统管理器配置文件,启动node_exporter服务并设置开机自启

1
2
3
4
systemctl daemon-reload
systemctl start node_exporter
systemctl enable node_exporter
systemctl status node_exporter

安装Prometheus node-exporter(容器方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
services:
node-exporter:
image: quay.io/prometheus/node-exporter
container_name: node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- 9100:9100
networks:
linux_exporter:
ipv4_address: 172.20.104.11

networks:
linux_exporter:
driver: bridge
ipam:
config:
- subnet: 172.20.104.0/24

安装 OpenTelemetry Collector

创建OpenTelemetry Collector配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mkdir /data/opentelemetry-collector
vi /data/opentelemetry-collector/config.yaml

receivers:
prometheus:
config:
scrape_configs:
- job_name: 'vm-monitoring' #要与skywalking-oap中的otel-rules的vm.yaml中的名称保持一致
scrape_interval: 5s
static_configs:
- targets: ['10.10.2.145:9100']
labels:
host_name: 10.10.2.145
service: oap-server
processors:
batch:

exporters:
otlp:
endpoint: 10.10.2.145:11800
tls:
insecure: true
logging:
loglevel: debug

service:
pipelines:
metrics:
receivers: [prometheus]
processors: [batch]
exporters: [otlp, logging]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
services:
otelcol:
image: otel/opentelemetry-collector
container_name: otelcol
restart: always
environment:
- TZ=Asia/Shanghai
volumes:
- /data/opentelemetry-collector/config.yaml:/etc/otelcol/config.yaml
networks:
opentelemetry:
ipv4_address: 172.20.101.11

networks:
opentelemetry:
driver: bridge
ipam:
config:
- subnet: 172.20.101.0/24

opentelemetry-collector最新镜像配置文件变更

在最新版的容器镜像中(0.113.0)中使用导出器exporters中使用debug代替logging。

即在v0.86.0版本之前使用logging

1
2
3
4
5
6
7
exporters:
otlp:
endpoint: ip+端口
tls:
insecure: true
logging:
loglevel: debug

之后使用debug

1
2
3
4
5
6
7
exporters:
otlp:
endpoint: ip+端口
tls:
insecure: true
debug:
verbosity: detailed

SkyWalking服务自监控开启

开启后端遥测,在skywalking-oap的配置文件application.yml中,找到promethus的部分,修改参数。

1
2
3
4
5
6
7
8
9
telemetry:
selector: ${SW_TELEMETRY:prometheus} #将none修改为prometheus
none:
prometheus:
host: ${SW_TELEMETRY_PROMETHEUS_HOST:0.0.0.0}
port: ${SW_TELEMETRY_PROMETHEUS_PORT:1234}
sslEnabled: ${SW_TELEMETRY_PROMETHEUS_SSL_ENABLED:false}
sslKeyPath: ${SW_TELEMETRY_PROMETHEUS_SSL_KEY_PATH:""}
sslCertChainPath: ${SW_TELEMETRY_PROMETHEUS_SSL_CERT_CHAIN_PATH:""}

在OpenTelemetry Collector配置文件中加入自监控的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
receivers:
prometheus:
config:
scrape_configs:
- job_name: 'vm-monitoring'
scrape_interval: 5s
static_configs:
- targets: ['10.10.2.145:9100']
labels:
host_name: 10.10.2.145
service: skywalking-oap-server
prometheus/2: #新增
config:
scrape_configs:
- job_name: 'skywalking-so11y' #要与skywalking-oap中的otel-rules的oap.yaml中的名称保持一致
scrape_interval: 5s
static_configs:
- targets: ['10.10.2.145:1234'] #端口为1234
labels:
host_name: 10.10.2.145_self
service: skywalking-oap


processors:
batch:
batch/2:

exporters:
otlp:
endpoint: 10.10.2.145:11800
tls:
insecure: true
logging:
loglevel: debug
otlp/2:
endpoint: 10.10.2.145:11800
tls:
insecure: true
logging/2:
loglevel: debug

service:
pipelines:
metrics:
receivers: [prometheus, prometheus/2]
processors: [batch, batch/2]
exporters: [otlp, otlp/2, logging, logging/2]

依次重启otelcol容器和skywalking-oap,查看是否生成自监控。

开启数据库MySQL/MariaDB监控

(1)部署mysqld_exporter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
services:
mysqld_exporter:
image: prom/mysqld-exporter
container_name: mysqld_exporter
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- "9104:9104"
command:
- "--mysqld.username=user:password" #用户名和密码
- "--mysqld.address=10.10.2.145:3306" #ip和端口号
networks:
sw-mysql:
ipv4_address: 172.20.102.11

networks:
sw-mysql:
driver: bridge
ipam:
config:
- subnet: 172.20.102.0/24

(2) 在OpenTelemetry Collector配置文件中mysql的监控参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
receivers:
prometheus:
config:
scrape_configs:
- job_name: 'vm-monitoring'
scrape_interval: 5s
static_configs:
- targets: ['10.10.2.145:9100']
labels:
host_name: 10.10.2.145
service: skywalking-oap-server
prometheus/2:
config:
scrape_configs:
- job_name: 'skywalking-so11y'
scrape_interval: 5s
static_configs:
- targets: ['10.10.2.145:1234']
labels:
host_name: 10.10.2.145_self
service: skywalking-oap

prometheus/3: #mysql、mariadb的监控部分
config:
scrape_configs:
- job_name: 'mysql-monitoring' #要与skywalking-oap中的otel-rules/mysql目录中的yaml文件中的名称保持一致
scrape_interval: 5s
static_configs:
- targets: ['10.10.2.145:9104']
labels:
host_name: mariadb-monitoring

processors:
batch:
batch/2:
batch/3:

exporters:
otlp:
endpoint: 10.10.2.145:11800
tls:
insecure: true
logging:
loglevel: debug
otlp/2:
endpoint: 10.10.2.145:11800
tls:
insecure: true
logging/2:
loglevel: debug
otlp/3:
endpoint: 10.10.2.145:11800
tls:
insecure: true
logging/3:
loglevel: debug

service:
pipelines:
metrics:
receivers:
- prometheus
- prometheus/2
- prometheus/3
processors:
- batch
- batch/2
- batch/3
exporters:
- otlp
- otlp/2
- otlp/3
- logging
- logging/2
- logging/3

依次重启otelcol容器和skywalking-oap,查看是否生成mysql或mariadb的监控数据。

开启Elasticsearch监控

(1)部署elasticsearch_exporter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
services:
elasticsearch_exporter:
image: quay.io/prometheuscommunity/elasticsearch-exporter:latest
container_name: elasticsearch_exporter
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- "9114:9114"
command:
#- '--es.uri=http://elastic:elastic@10.10.2.145:9200' #es使用http协议
- '--es.uri=https://elastic:elastic@10.10.2.145:9200'
- "--es.ssl-skip-verify" #连接到es时跳过SSL验证
networks:
es_exporter:
ipv4_address: 172.20.103.11

networks:
es_exporter:
driver: bridge
ipam:
config:
- subnet: 172.20.103.0/24

(2)在OpenTelemetry Collector配置文件中es的监控参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
receivers:
prometheus:
config:
scrape_configs:
- job_name: 'elasticsearch-monitoring'
scrape_interval: 5s
static_configs:
- targets: ['10.10.2.145:9114']
labels:
host_name: elasticsearch-monitoring


processors:
batch:

exporters:
otlp:
endpoint: 10.10.2.145:11800
tls:
insecure: true
logging:
loglevel: debug

service:
pipelines:
metrics:
receivers:
- prometheus
processors:
- batch
exporters:
- otlp
- logging

依次重启otelcol容器和skywalking-oap,查看是否生成es的监控数据。

开启数据库PostgreSQL监控

(1)部署postgres-exporter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
services:
postgres-exporter:
image: quay.io/prometheuscommunity/postgres-exporter
container_name: postgres-exporter
restart: always
environment:
TZ: "Asia/Shanghai"
DATA_SOURCE_URI: "localhost:5432/postgres?sslmode=disable"
DATA_SOURCE_USER: "postgres"
DATA_SOURCE_PASS: "password"
ports:
- "9187:9187"
networks:
sw-pgsql:
ipv4_address: 172.20.105.11

networks:
sw-pgsql:
driver: bridge
ipam:
config:
- subnet: 172.20.105.0/24

(2)在OpenTelemetry Collector配置文件中postgres sql的监控参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
receivers:
prometheus:
config:
scrape_configs:
- job_name: 'postgresql-monitoring'
scrape_interval: 5s
static_configs:
- targets: ['10.10.2.145:9187']
labels:
host_name: postgresql-monitoring


processors:
batch:

exporters:
otlp:
endpoint: 10.10.2.145:11800
tls:
insecure: true
logging:
loglevel: debug

service:
pipelines:
metrics:
receivers:
- prometheus
processors:
- batch
exporters:
- otlp
- logging

依次重启skywalking-oap容器和otelcol,查看是否生成postgres sql的监控数据。

开启数据库MongoDB监控

(1)部署mongodb_exporter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
services:
mongodb_exporter:
image: percona/mongodb_exporter:0.40
container_name: mongodb_exporter
restart: always
ports:
- "9216:9216"
environment:
- TZ=Asia/Shanghai
- MONGODB_URI=mongodb://user:password@192.168.1.23:27017/?authSource=admin
command:
- --collect-all
- --web.listen-address=:9216
networks:
sw-mongodb:
ipv4_address: 172.20.106.11

networks:
sw-mongodb:
driver: bridge
ipam:
config:
- subnet: 172.20.106.0/24

(2)在OpenTelemetry Collector配置文件中mongodb的监控参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
receivers:
prometheus:
config:
scrape_configs:
- job_name: 'mongodb-monitoring'
scrape_interval: 5s
static_configs:
- targets: ['10.10.2.145:9216']
labels:
host_name: mongodb-monitoring


processors:
batch:

exporters:
otlp:
endpoint: 10.10.2.145:11800
tls:
insecure: true
logging:
loglevel: debug

service:
pipelines:
metrics:
receivers:
- prometheus
processors:
- batch
exporters:
- otlp
- logging

.NET项目服务链路追踪

安装 SkyWalking .NET Core Agent(Windows环境)

(1)在Visual Studio中的项目中安装nugetSkyAPM.Agent.AspNetCore

(2)在launchSettings.json文件中新增环境变量"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "SkyAPM.Agent.AspNetCore""SKYWALKING__SERVICENAME": "服务名(与执行的dll程序的名称一致)"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  "profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5205",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
//新增环境变量
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "SkyAPM.Agent.AspNetCore",
"SKYWALKING__SERVICENAME": "服务名(与执行的dll程序的名称一致)"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7105;http://localhost:5205",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
//新增环境变量
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "SkyAPM.Agent.AspNetCore",
"SKYWALKING__SERVICENAME": "服务名(与执行的dll程序的名称一致)"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
//新增环境变量
"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "SkyAPM.Agent.AspNetCore",
"SKYWALKING__SERVICENAME": "服务名(与执行的dll程序的名称一致)"
}
}
}
,

(3)在Program.cs中添加配置参数。

1
2
3
4
5
//SkyApm
builder.Services.AddSkyApmExtensions();
Environment.SetEnvironmentVariable
("ASPNETCORE_HOSTINGSTARTUPASSEMBLIES", "SkyAPM.Agent.AspNetCore");
Environment.SetEnvironmentVariable("SKYWALKING__SERVICENAME", "服务名(与执行的dll程序的名称一致)");

(4)添加skyapm.json文件,添加方式有两种:

一是在dll运行程序的同目录下创建skyapm.json,并写入以下内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"SkyWalking": {
"ServiceName": "服务名(与执行的dll程序的名称一致)",
"Namespace": "",
"HeaderVersions": [
"sw8"
],
"Sampling": {
"SamplePer3Secs": -1,
"Percentage": -1.0
},
"Logging": {
"Level": "Information",
"FilePath": "logs\\skyapm-{Date}.log"
},
"Transport": {
"Interval": 3000,
"ProtocolVersion": "v8",
"QueueSize": 30000,
"BatchSize": 3000,
"gRPC": {
"Servers": "SkyWalking服务ip:11800",
"Timeout": 10000,
"ConnectTimeout": 10000,
"ReportTimeout": 600000,
"Authentication": ""
}
}
}
}

二是在Visual Studio的控制台中输入命令创建skyapm.json。

1
2
dotnet tool install -g SkyAPM.DotNet.CLI
dotnet skyapm config 服务名(与执行的dll程序的名称一致) SkyWalking服务ip:11800

(5)配置完成后,在运行的服务器中加入环境变量

方式一:在服务器添加

1
2
3
4
5
6
7
8
9
10
vi  ~/.bashrc


export ASPNETCORE_ENVIRONMENT=development
export ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore
export SKYWALKING__SERVICENAME=服务名


#使得配置生效
source ~/.bashrc

方式二:在容器中添加,可在Dockerfile文件中添加

1
2
3
4
5
6
7
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
......
ENV ASPNETCORE_ENVIRONMENT=development
ENV ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore
ENV SKYWALKING__SERVICENAME=服务名
#容器入口点
ENTRYPOINT ["dotnet", "xxx"]

(6)访问.NET项目,查看Skywalking中常规服务-服务中生成的服务监控。(效果图在最后)

安装 SkyWalking .NET Core Agent(Linux环境)

适用于在Linux上创建的.NET项目

(1)安装 SkyWalking .NET Core Agent

1
2
3
dotnet add package SkyAPM.Agent.AspNetCore
export ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore
export SKYWALKING__SERVICENAME=服务名(与执行的dll程序的名称一致)

(2)安装SkyAPM.DotNet.CLI,用于生成skyapm.json

1
2
dotnet tool install -g SkyAPM.DotNet.CLI
dotnet skyapm config 服务名(与执行的dll程序的名称一致) SkyWalking服务ip:11800

(3)配置完成后,在运行的服务器中加入环境变量

方式一:在服务器添加

1
2
3
4
5
6
7
8
9
10
vi  ~/.bashrc


export ASPNETCORE_ENVIRONMENT=development
export ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore
export SKYWALKING__SERVICENAME=服务名


#使得配置生效
source ~/.bashrc

方式二:在容器中添加,可在Dockerfile文件中添加

1
2
3
4
5
6
7
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
......
ENV ASPNETCORE_ENVIRONMENT=development
ENV ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore
ENV SKYWALKING__SERVICENAME=服务名
#容器入口点
ENTRYPOINT ["dotnet", "xxx"]

(4)访问.NET项目,查看Skywalking中常规服务-服务中生成的服务监控。

接入前端监控

(1)项目中添加skywalking-client-js包

1
npm install skywalking-client-js --save

(2)在vue.config.js中配置代理

1
2
3
4
5
6
7
8
9
10
proxy:{
'/browser': {
target:'SkyWalking服务ip:12800',//这里是路由和报错报告的代理
changeOrigin: true
},
'/v3':{
target:'SkyWalking服务ip:12800',
changeOrigin: true//这里是追踪报告的代理
}
}

(3)在main.js中接入skywalking-client-js

1
2
3
4
5
6
7
8
9
10
//skywalking监控系统
import ClientMonitor from 'skywalking-client-js';
//注册skywalking
ClientMonitor.register({
service: '服务名',//服务名称
serviceVersion:'',//应用版本号
traceSDKInternal:true,//追踪sdk
pagePath: location.href,//当前路由地址
useFmp: true
});

(4)在对应业务系统的服务器中,在对应发布nignx代理服务中加入对应的代理配置。

1
2
3
4
5
6
7
8
location /browser/ {
proxy_pass http://SkyWalking服务ip:12800/browser/;
client_max_body_size 1000M;
}
location /v3/ {
proxy_pass http://SkyWalking服务ip:12800/v3/;
client_max_body_size 1000M;
}