APM配置
6.1 服务接入
背景介绍:用户可以方便地管理应用的接入和监控数据上报情况,并使用调用链检索功能来查看和分析trace信息,帮助定位和解决应用中的性能问题和异常情况
整体步骤:应用服务接入——调用链检索
Step1:应用服务接入
路径:管理-APM管理-应用接入
应用接入用于管理接入APM的应用,进行数据接入以及查看接入服务的数据上报情况。
添加应用:支持选择WeOps现有应用,加入列表后,并为该应用接入服务
应用加入后,点击“接入服务”根据指引进行服务的接入
为应用进行服务的接入,WeOps采用无代码入侵的方式进行探针的安装和采集,支持java、python等开发语言和数十种开发框架(具体开发框架详见《内容说明——4、APM内容说明》),接入成功后,可以查看各个服务的数据上报情况。
Step2:调用链检索 路径:APM-调用链检索
如下图,当应用的服务接入完成之后,可以在APM-调用链检索进行trace的搜索和查看。可分为如下四个区域,分别进行trace的条件/时间设置、trace列表查看和各个请求详情的查看。
①搜索条件区域:支持切换不同的应用和对应的服务,也支持通过trace ID或者链路入口接口/方法的关键词进行搜索,此外也可以设置耗时查询范围
②时间选择器:支持选择trace的产生时间范围,便于进一步锁定
③检索结果:展示符合搜索条件下所有的trace列表,可展开查看详情以及具体的请求步骤,各个请求也可点击查看详情。
- ④请求详情:展示该次请求的相关信息,具体如下:
基本信息:该请求的基本调用信息,客户端和服务端调用的耗时情况
源数据:客户端和服务端原始的数据
Step3:查看应用情况
路径:APM-调用链检索
应用观测提供应用下服务运行态全景调用关系和服务、接口请求量统计情况,帮基于全景视角观测系统运行时实际流量运行状态,清晰构建系统调用依赖关系包含服务、外部服务、数据库、中间件等系统组件。
- 如下图,应用列表展示接入的所有应用,以及该应用的关键指标,点击进入该应用的详情页面。
应用的详情页分为三个模块:应用分析——展示整个应用的拓扑和关键指标情况,服务分析——该应用下所有服务的性能情况,接口分析——所有接口的性能情况。
如下图,展示整个应用的全景拓扑图和该应用的关键指标信息,具体说明如下
① 时间选择区域:支持切换时间范围,切换后下方的拓扑图和指标折线图会根据选择的时间范围更新展示。
② 应用全景拓扑图:展示该应用所有服务的调用拓扑关系,具体说明如下
节点图标大小:根据服务请求量和请求负载判断节点拓扑大小,确定当前拓扑的最大值和最小值,其余节点按比例确定节点大小
图标悬停展示:将鼠标悬停在节点可以查看该节点详情,包括负载、请求量、耗时、错误等信息
③ 应用性能关键指标:提供当前时间范围的请求数量,错误数、服务请求,响应时间的关键指标折线图
④ 错误分析:如下图,切换可以查询所有错误的情况,支持按照时间/服务/接口/方法进行筛选。点击接口名称可以调整至这个接口的分析页面;点击调用链,可以跳转到该请求的trace详情页;点击错误堆栈,可以查看堆栈的详情。
- 如下图,展示该应用下所有服务的列表,展开后可以查看服务的详情
- 如下图,展示该服务相互调用的拓扑关系、关键指标(请求、响应时间、错误率)、错误分析
- 如下图,展示该应用下所有接口的列表,展开后可以查看接口的详情
- 如下图,展示该接口关键指标(请求、响应时间、错误率)、错误分析
6.2 APM监控告警
背景介绍:公司的应用已经接入WeOps,需要对某些业务关键的APM指标进行监控,一旦发现异常情况,发出告警通知对应人员及时进行处理。
整体步骤:APM监控策略配置——APM告警查看和处理
Step1:APM监控策略配置
APM监控策略配置的入口有以下2种
- (1)监控策略:如下图,在监控管理-监控策略中也可以直接找到APM监控策略进行创建
路径:管理-监控管理-监控策略-APM策略
- (2)APM监控:如下图,在APM的管理的APM监控中,也可进行APM监控策略的创建
路径:管理-APM管理-APM监控
2个入口的APM监控创建策略页面一致,具体如下图
(1)基本信息:策略名称等
(2)监控项:支持请求数、平均响应时间、请求失败数等关键指标
(3)监控目标:选择需要监控的业务
Step2:APM告警查看和处理
- 按照APM监控策略进行监控,一旦符合策略配置的条件,即可产生告警,告警内容如下图
6.3 K8S集群的OT探针接入指引
前置准备
以下内容需要按照顺序进行部署
(1)部署cert manager到集群
可参考: https://cert-manager.io/docs/installation/
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.3/cert-manager.yaml
等待cert-manager全部就绪才可部署opearator,例如
kubectl get pod -n cert-manager
NAME READY STATUS RESTARTS AGE
cert-manager-56588b57f4-6pbc2 1/1 Running 0 5d5h
cert-manager-cainjector-7bbf568f47-m2f6l 1/1 Running 0 5d5h
cert-manager-webhook-7f7c7898cc-b9x6f 1/1 Running 0 5d5h
(2)部署operator
需要注意依赖的k8s版本,最下方已列出对应的版本依赖
# 版本v0.82.0
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/download/v0.82.0/opentelemetry-operator.yaml
(3)部署Instrumentation
注意: 必须指定命名空间以对特定命名空间的资源进行注入,否则将不会生效。例如,如果未指定命名空间,只有默认命名空间才能接受自动注入
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: my-instrumentation
namespace: tomcat
spec:
propagators:
- tracecontext
- baggage
- b3
sampler:
type: parentbased_traceidratio
argument: "0.25"
java:
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://127.0.0.1:4317
- name: OTEL_RESOURCE_ATTRIBUTES
value: bk.biz.id=2
- name: OTEL RESOURCE_ATTRIBUTES
value: 18ed4404-f20b-457d-a5e8-7fa964061823
容器安装探针
(1)提前拉取java agent镜像
docker pull ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.28.0
(2)添加参数
- 注意部署文件中annotations的添加位置,在多容器情况下需要指定注入的容器名称
- 若Instrumentation修改过,则注入容器的部署部分需要重新部署,或者重新拉起新的pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment-with-multiple-containers
spec:
selector:
matchLabels:
app: my-pod-with-multiple-containers
replicas: 1
template:
metadata:
labels:
app: my-pod-with-multiple-containers
annotations:
instrumentation.opentelemetry.io/inject-java: "true"
instrumentation.opentelemetry.io/container-names: "myapp"
spec:
containers:
- name: myapp
image: myImage1
- name: myapp2
image: myImage2
- name: myapp3
image: myImage3
查看调用链
版本依赖
目前WeOps内置的探针版本为v0.82.0,适用的K8S版本号为:v1.19 to v1.27
OpenTelemetry Operator | Kubernetes | Cert-Manager |
---|---|---|
v0.90.0 | v1.23 to v1.28 | v1 |
v0.89.0 | v1.23 to v1.28 | v1 |
v0.88.0 | v1.23 to v1.28 | v1 |
v0.87.0 | v1.23 to v1.28 | v1 |
v0.86.0 | v1.23 to v1.28 | v1 |
v0.85.0 | v1.19 to v1.28 | v1 |
v0.84.0 | v1.19 to v1.28 | v1 |
v0.83.0 | v1.19 to v1.27 | v1 |
v0.82.0 | v1.19 to v1.27 | v1 |
v0.81.0 | v1.19 to v1.27 | v1 |
v0.80.0 | v1.19 to v1.27 | v1 |
v0.79.0 | v1.19 to v1.27 | v1 |
v0.78.0 | v1.19 to v1.27 | v1 |
v0.77.0 | v1.19 to v1.26 | v1 |
v0.76.1 | v1.19 to v1.26 | v1 |
v0.75.0 | v1.19 to v1.26 | v1 |
6.4 K8S集群Beyla接入指引
第一步、创建命名空间并配置权限
创建命名空间
kubectl create namespace beyla
创建ServiceAccount并绑定ClusterRole授权,授予pod和ReplicaSets的list和watch权限
apiVersion: v1
kind: ServiceAccount
metadata:
name: beyla
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: beyla
rules:
- apiGroups: ["apps"]
resources: ["replicasets"]
verbs: ["list", "watch"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: beyla
subjects:
- kind: ServiceAccount
name: beyla
namespace: beyla
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: beyla
第二步、配置Beyla的采集规则
部署Beyla前,需通过配置采集规则,定义采集K8S集群中的哪些数据
apiVersion: v1
kind: ConfigMap
metadata:
namespace: beyla
# 如果需要接入多个的业务,需部署多套Beyla,需更改metadata.name保证不重复
name: beyla-config
data:
beyla-config.yml: |
# 开启kubernetes发现和元数据
attributes:
kubernetes:
enable: true
# 提供自动路由报告,同时最小化基数
routes:
unmatched: heuristic
# 填写需要检测的服务的deployment,比如检测docs的deployment
discovery:
services:
- k8s_deployment_name: "^docs$" # 根据实际的命名规则调整正则表达式
# 还可以支持检测多个deployment,比如解除下方注释则会同时检测docs和website的deployment
# - k8s_deployment_name: "^website$"
除了使用k8s_deployment_name
字段作为检测规则外,还支持以下字段(选择一类字段使用即可):
- k8s_pod_name
- k8s_namespace
- k8s_replicaset_name
- k8s_statefulset_name
- k8s_daemonset_name
- k8s_owner_name (
Deployment
,ReplicaSet
,DaemonSet
orStatefulSet
)
第三步、使用DaemonSet方式部署Beyla
具体如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
namespace: beyla
# 如果需要接入多个的业务,需部署多套Beyla,需更改metadata.name保证不重复
name: beyla
spec:
selector:
matchLabels:
instrumentation: beyla # 需与metadata.name保持一致
template:
metadata:
labels:
instrumentation: beyla # 需与metadata.name保持一致
spec:
serviceAccountName: beyla
hostPID: true # 必须为true,否则将导致Beyla服务异常
volumes:
- name: beyla-config
configMap:
name: beyla-config # 需与第二步中采集规则的metadata.name一致
containers:
- name: beyla
image: grafana/beyla:1.3.1
securityContext:
privileged: true # 必须为true,否则将导致Beyla服务异常
volumeMounts:
- mountPath: /config
name: beyla-config
env:
- name: BEYLA_CONFIG_PATH
value: /config/beyla-config.yml
- name: OTEL_EXPORTER_OTLP_ENDPOINT
valueFrom:
secretKeyRef:
name: grafana-credentials
key: otlp-endpoint
- name: OTEL_EXPORTER_OTLP_HEADERS
valueFrom:
secretKeyRef:
name: grafana-credentials
key: otlp-headers
- name: OTEL_RESOURCE_ATTRIBUTES
value: bk.biz.id=2 # WeOps中的配置应用id