跳到主要内容

APM配置

6.1 服务接入

背景介绍:用户可以方便地管理应用的接入和监控数据上报情况,并使用调用链检索功能来查看和分析trace信息,帮助定位和解决应用中的性能问题和异常情况

整体步骤:应用服务接入——调用链检索

Step1:应用服务接入

路径:管理-APM管理-应用接入

应用接入用于管理接入APM的应用,进行数据接入以及查看接入服务的数据上报情况。

  • 添加应用:支持选择WeOps现有应用,加入列表后,并为该应用接入服务

  • 应用加入后,点击“接入服务”根据指引进行服务的接入

  • 为应用进行服务的接入,WeOps采用无代码入侵的方式进行探针的安装和采集,支持java、python等开发语言和数十种开发框架(具体开发框架详见《内容说明——4、APM内容说明》),接入成功后,可以查看各个服务的数据上报情况。

Step2:调用链检索 路径:APM-调用链检索

如下图,当应用的服务接入完成之后,可以在APM-调用链检索进行trace的搜索和查看。可分为如下四个区域,分别进行trace的条件/时间设置、trace列表查看和各个请求详情的查看。

  • ①搜索条件区域:支持切换不同的应用和对应的服务,也支持通过trace ID或者链路入口接口/方法的关键词进行搜索,此外也可以设置耗时查询范围

  • ②时间选择器:支持选择trace的产生时间范围,便于进一步锁定

  • ③检索结果:展示符合搜索条件下所有的trace列表,可展开查看详情以及具体的请求步骤,各个请求也可点击查看详情。

  • ④请求详情:展示该次请求的相关信息,具体如下:
基本信息:该请求的基本调用信息,客户端和服务端调用的耗时情况
参数列表:展示请求客户端和服务端所用参数的key和value
源数据:客户端和服务端原始的数据

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 OperatorKubernetesCert-Manager
v0.90.0v1.23 to v1.28v1
v0.89.0v1.23 to v1.28v1
v0.88.0v1.23 to v1.28v1
v0.87.0v1.23 to v1.28v1
v0.86.0v1.23 to v1.28v1
v0.85.0v1.19 to v1.28v1
v0.84.0v1.19 to v1.28v1
v0.83.0v1.19 to v1.27v1
v0.82.0v1.19 to v1.27v1
v0.81.0v1.19 to v1.27v1
v0.80.0v1.19 to v1.27v1
v0.79.0v1.19 to v1.27v1
v0.78.0v1.19 to v1.27v1
v0.77.0v1.19 to v1.26v1
v0.76.1v1.19 to v1.26v1
v0.75.0v1.19 to v1.26v1

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 (DeploymentReplicaSetDaemonSet or StatefulSet)

第三步、使用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