技术之道

长风破浪会有时,直挂云帆济沧海

  • 首页
  • 分类
  • 归档
  • 标签

  • 搜索
服务治理 k8s tabnine cursor github copilot ai chatgpt chatgpt ai sop 技术选型 bigdata 工具 多进程多线程 docker 计算机网络 mysql 事务 基础架构 kafka nio 分布式 服务搭建 监控 jvm 管理/成长 jenkins devops 云原生 nginx 架构 故障处理 hive spark mapreduce apm redis memcached java 性能 linux

Skywalking

发表于 2022-08-22 | 分类于 中间件 | 0 | 阅读次数 1388

Skywalking

什么是Skywalking

​ SkyWalking是一个针对分布式系统的应用性能监控(ApplicationPerformanceMonitor,APM)和可观测性分析平台(ObservabilityAnalysisPlatform)。它提供了多维度应用性能分析手段,从分布式拓扑图到应用性能指标、Trace、日志的关联分析与告警

image.png

SkyWalking 涵盖了可观察性的所有 3 个领域,包括Tracing、Metrics和Logging

  • 追踪。SkyWalking 原生数据格式,包括 Zipkin v1 和 v2,以及 Jaeger。
  • 指标。SkyWalking 与 Service Mesh 平台(如 Istio、Envoy 和 Linkerd)集成,将可观察性构建到数据面板或控制面板中。此外,SkyWalking 原生代理可以在指标模式下运行,这大大提高了性能。
  • 记录。包括从磁盘或通过网络收集的日志。本机代理可以自动将跟踪上下文与日志绑定,或者使用 SkyWalking 通过文本内容绑定跟踪和日志。

Skywalking的适用场景

​ SkyWalking是一个为微服务、容器化和分布式系统而生的高度组件化的APM项目。它解决了系统调试过程中,在线运行程序出现故障时的问题定位。

Skywalking不是一个单纯追踪系统

​ SkyWalking首先是一个应用性能监控工具,它的目标是应用性能。SkyWalking在语言探针的场景下,具有自动化分布式追踪(distributedtracing)的能力,但这个能力是为应用性能监控服务的。

Skywalking不是方法诊断系统

​ 方法级别追踪是SkyWalking技术栈能够做到的技术,但是官方并不推荐这样使用,特别是在生产环境中。方法级别追踪是性能诊断工具的工作,而不是APM系统要做的。APM系统要求在有限性能消耗下,在生产环境长时间低消耗运行,而方法监控会消耗大量的内存和性能,并不适合大流量系统。

Skywalking支持追踪方法参数

​ 参数追踪和方法追踪类似,即使是针对HTTP请求的方法参数追踪,也会对应用系统和APM造成较大的压力。

Skywalking支持代码性能剖析

  • 精确的问题定位,直接到代码方法和代码行;
  • 无须反复增删埋点,大大减少人力开发成本;
  • 不用承担过多埋点对目标系统和监控系统的压力和性能风险;
  • 按需使用,平时对系统无消耗,使用时消耗稳定。

SKywalking优势

易接入

​ Skywalking可以无缝支持以及稳定的分布式服务架构,而无需增加运维团队和开发团队工作量

易维护

​ 构建集群架构简单,对于不同存储平台(MySQL、TiDB或Elasticsearch)具备基本的集群运维能力,可以轻松监控百亿级流量系统

高性能

​ SkyWalking在超过5000TPS下超级优良的性能,在设计之初也是要保证探针能够在单进程1万TPS级别系统中,提供稳定的100%采样,以及合理的性能消耗(小于10%增幅)。

Skywalking架构设计

image.png

  • UI 一个基于接口高度定制化的Web系统,用户可以可视化查看和管理 SkyWalking 数据。
  • 探针 基于不同的来源可能是不一样的, 但作用都是收集数据, 将数据格式化为 SkyWalking 适用的格式.
  • 平台后端, 支持数据聚合, 数据分析以及驱动数据流从探针到用户界面的流程。分析包括 Skywalking 原生追踪和性能指标以及第三方来源,包括 Istio 及 Envoy telemetry , Zipkin 追踪格式化等。 你甚至可以使用 Observability Analysis Language 对原生度量指标 和 用于扩展度量的计量系统 自定义聚合分析。
  • 存储 通过开放的插件化的接口存放 SkyWalking 数据. 你可以选择一个既有的存储系统, 如 ElasticSearch, H2 或 MySQL 集群(Sharding-Sphere 管理),也可以选择自己实现一个存储系统. 当然, 我们非常欢迎你贡献新的存储系统实现。

Skywalking部署

UI/平台后端

规格

UI: 1台2C4G

**后端:**3台Pod 2C4G

部署

基于原生
FROM apache/skywalking-ui:8.8.1

# 打包的人
MAINTAINER "[email protected]"

# 时区修改为东八区
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    && apk add --no-cache tzdata \
    && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
    
# 打镜像docker build -t swr.cn-north-4.myhuaweicloud.com/teddy_repo/td-devops-skywalking-ui-hw:5 .
自定义
# 操作系统基础镜像
FROM centos:centos7.9.2009

# 打包的人
MAINTAINER "[email protected]"

# 运行
RUN rm -f /etc/localtime \
    && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && yum install -y wget vim net-tools unzip zip \
    && wget http://wget.teddymobile.net/jdk-8u271-linux-x64.tar.gz \
    && tar xf jdk-8u271-linux-x64.tar.gz && mv jdk1.8.0_271 /usr/local/ \
    && wget http://wget.teddymobile.net/lsj/apache-skywalking-apm-es7-8.6.0.tar.gz \
    && tar xf apache-skywalking-apm-es7-8.6.0.tar.gz && mv skywalking /usr/local/ \
    && rm -rf apache-skywalking-apm-es7-8.6.0.tar.gz && rm -rf jdk-8u271-linux-x64.tar.gz

# 定义环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_271/
ENV PATH $JAVA_HOME/bin:$PATH

# 设置编码
ENV LC_ALL=zh_CN.utf8
ENV LANG=zh_CN.utf8
ENV LANGUAGE=zh_CN.utf8
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8

CMD ["sh","/usr/local/skywalking/start.sh"]

#制作镜像docker build -t ccr.ccs.tencentyun.com/teddy_repo/td-devops-skywalking:202107011401.3bj5f296 .

探针

官方案例

apiVersion: v1
kind: Pod
metadata:
  name: agent-as-sidecar
spec:
  restartPolicy: Never

  volumes:
    - name: skywalking-agent
      emptyDir: { }

  initContainers:
    - name: agent-container
      image: apache/skywalking-java-agent:8.7.0-alpine
      volumeMounts:
        - name: skywalking-agent
          mountPath: /agent
      command: [ "/bin/sh" ]
      args: [ "-c", "cp -R /skywalking/agent /agent/" ]

  containers:
    - name: app-container
      image: springio/gs-spring-boot-docker
      volumeMounts:
        - name: skywalking-agent
          mountPath: /skywalking
      env:
        - name: JAVA_TOOL_OPTIONS
          value: "-javaagent:/skywalking/agent/skywalking-agent.jar"

自定义

# 操作系统基础镜像
FROM centos:centos7.9.2009

# 打包的人
MAINTAINER "[email protected]"

# 运行
RUN rm -f /etc/localtime \
    && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && yum install -y wget vim net-tools unzip zip \
    && mkdir /usr/local/agents \
    && wget http://wget.teddymobile.net/jdk-8u271-linux-x64.tar.gz \
    && tar xf jdk-8u271-linux-x64.tar.gz && mv jdk1.8.0_271 /usr/local/ \
    && wget http://wget.teddymobile.net/skywalking/skywalking-agent.tar.gz \
    && tar xf skywalking-agent.tar.gz && mv skywalking /usr/local/agents/ \
    && wget http://wget.teddymobile.net/prometheus-agent.tar.gz \
    && tar xf prometheus-agent.tar.gz && mv prometheus /usr/local/agents/ \
    && rm -rf prometheus-agent.tar.gz jdk-8u271-linux-x64.tar.gz skywalking-agent.tar.gz

# 定义环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_271/
ENV PATH $JAVA_HOME/bin:$PATH

# 设置编码
ENV LC_ALL=zh_CN.utf8
ENV LANG=zh_CN.utf8
ENV LANGUAGE=zh_CN.utf8
RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8

# 启动容器执行的命令,仅用于验证安装配置是否正确,生产环境使用需注释后再build
#CMD ["java","-version"]

存储

ElasticSearch7

标准型SA2 2核4G, 3个, 500GB 高性能云硬盘 x 1

UI

追踪

image.png

  • 跟踪段列表与跟踪列表不同。每个跟踪都有几个属于不同服务的段。如果您按所有服务或按跟踪 ID 启动查询,则可能会在此处列出具有相同跟踪 ID 的不同段。
  • 可以点击跨度。每个跨度的详细信息将在左侧弹出。
  • Trace Views提供了三种典型且不同的使用视图来可视化跟踪。

后端

基础设置

服务分组

SkyWalking 支持各种默认和自定义的仪表板模板。每个模板都为特定领域的服务提供了适当的布局。

因此,从 8.3.0 版本开始,SkyWalking OAP 基于这种简单的命名格式生成了组:

服务名称=[{服务名称} = [服务名称=[{组名称}::]${逻辑名称}

image.png

集群管理

在很多产品环境中,后端需要支持高吞吐量并提供HA来保持健壮性,所以你总是需要在产品环境中进行集群管理。

注意,集群管理不为代理和探针提供服务发现机制。我们建议代理/探针使用网关到负载均衡器来访问 OAP 集群。

集群管理的核心特性是支持整个 OAP 集群运行分布式聚合和分析遥测数据。

多种方式支持后端管理集群:

  • Zookeeper coordinator.
  • Kubernetes.
  • Consul.
  • Etcd.
  • Nacos.

后端存储

  • H2
  • OpenSearch
  • ElasticSearch 6, 7
  • MySQL
  • TiDB
  • InfluxDB
  • PostgreSQL

数据过期设置

在 SkyWalking 中,有两种类型的可观测性数据:

  1. 记录包括跟踪、日志、topN 采样语句和警报。recordDataTTL适用于记录数据。
  2. 指标包括服务、实例、端点和拓扑图的所有指标。元数据(服务、实例或端点列表)也属于指标。metricsDataTTL适用于指标数据。

这些是不同类型的设置:

    # Set a timeout on metrics data. After the timeout has expired, the metrics data will automatically be deleted.
    recordDataTTL: ${SW_CORE_RECORD_DATA_TTL:3} # Unit is day
    metricsDataTTL: ${SW_CORE_METRICS_DATA_TTL:7} # Unit is day

Tracing

服务端采样率

​ 在服务端设置采样率只会将部分trace调用链路数据丢弃,不会影响Metric数据(比如service、serviceinstance、endpoint)统计的精确性,因而可以用来应对大量数据上报带来的存储系统压力。需要注意的是,虽然设置服务端采样会丢弃部分trace数据,但是OAP还是会尽量保持调用链路的完整性。

在agent-analyzer模块中,您将sampleRate通过配置找到设置traceSamplingPolicySettingsFile。

agent-analyzer:
  default:
    ...
    # The default sampling rate and the default trace latency time configured by the 'traceSamplingPolicySettingsFile' file.
    traceSamplingPolicySettingsFile: ${SW_TRACE_SAMPLING_POLICY_SETTINGS_FILE:trace-sampling-policy-settings.yml}
    forceSampleErrorSegment: ${SW_FORCE_SAMPLE_ERROR_SEGMENT:true} # When sampling mechanism activated, this config would make the error status segment sampled, ignoring the sampling rate.

默认trace-sampling-policy-settings.yml使用以下格式。可以使用动态配置来更新运行时中的设置。

default:
  # Default sampling rate that replaces the 'agent-analyzer.default.sampleRate'
  # The sample rate precision is 1/10000. 10000 means 100% sample in default.
  rate: 10000
  # Default trace latency time that replaces the 'agent-analyzer.default.slowTraceSegmentThreshold'
  # Setting this threshold about the latency would make the slow trace segments sampled if they cost more time, even the sampling mechanism activated. The default value is `-1`, which means would not sample slow traces. Unit, millisecond.
  duration: -1
#services:
#  - name: serverName
#    rate: 1000 # Sampling rate of this specific service
#    duration: 10000 # Trace latency threshold for trace sampling for this specific service

duration.rate允许您为此后端设置采样率。采样率精度为 1/10000。默认情况下,10000 表示 100% 样本。

forceSampleErrorSegment允许您在激活采样机制时保存所有错误段。当采样机制被激活时,这个配置会导致错误状态段被采样,忽略采样率。

default.duration允许您在激活采样机制时保存所有慢速跟踪段。设置此延迟阈值(以毫秒为单位)会导致慢跟踪段在消耗更多时间时被采样,即使采样机制已激活。默认值为-1,这意味着不会对慢速跟踪进行采样。

检查慢数据库语句

​ 慢查询语句默认是基于采样,每 10 分钟对前 50 个最慢的样本进行采样。慢查询定义:持续时间必须慢于阈值

database-type:thresholdValue,database-type2:thresholdValue2

Metrics

Prometheus

Prometheus fetcher 从 Prometheus 端点读取指标,并将指标转换为 SkyWalking 原生格式以供 MAL 引擎使用

告警

Logging

从 8.3.0 版本开始,SkyWalking 提供了用于浏览器监控的日志查询。使用Apache SkyWalking Client JS代理收集指标和错误日志。

从 8.5.0 版本开始,SkyWalking 支持通过其原生代理和第三方代理(如 Fluentd 和 Filebeat)收集日志。有关更多详细信息,请参阅日志分析器文档。

image.png

健康检查

健康检查旨在提供一种独特的方法来检查 OAP 服务器的健康状态。它包括模块的健康状态、GraphQL 和 gRPC 服务准备情况。

0 表示健康,超过 0 表示不健康。小于 0 表示 OAP 没有启动。

**详见:**https://skywalking.apache.org/docs/main/latest/en/setup/backend/backend-health-check/

探针

服务探针

  • Java agent. Learn how to install the Java agent in your service without affecting your code.
  • LUA agent. Learn how to install the Lua agent in Nginx + LUA module or OpenResty.
  • Kong agent. Learn how to install the Lua agent in Kong.
  • Python Agent. Learn how to install the Python Agent in a Python service.
  • Node.js agent. Learn how to install the NodeJS Agent in a NodeJS service.

The following agents and SDKs are compatible with SkyWalking’s data formats and network protocols, but are maintained by third parties. See their project repositories for guides and releases.

  • SkyAPM .NET Core agent. See .NET Core agent project document for more details.
  • SkyAPM PHP agent. See PHP agent project document for more details.
  • SkyAPM Go SDK. See go2sky project document for more details.
  • SkyAPM C++ SDK. See cpp2sky project document for more details.

浏览器探针

Apache SkyWalking Client JS是一个客户端 JavaScript 异常和跟踪库。

它具有以下特点:

  • 向 SkyWalking 后端提供指标和错误收集。
  • 轻量级。不需要浏览器插件。一个简单的 JavaScript 库。
  • 浏览器是整个分布式追踪系统的起点。

有关更多信息,请参阅客户端 JS官方文档。

兼容性

SkyWalking 8.0+ 使用 v3 协议。代理不必与 OAP 后端保持相同的版本。

JavaAgent

配置

属性键 描述 默认
agent.namespace 命名空间在跨进程传播中隔离头。HEADER 名称将为HeaderName:Namespace. 没有设置
agent.service_name 表示提供相同功能/逻辑的逻辑组的服务名称。建议:为每个逻辑服务组设置一个唯一的名称,服务实例节点共享相同的代码,最大长度为 50(UTF-8 字符)。可选,一旦service_name遵循<group name>::<logic name>格式,OAP 服务器将组名分配给服务元数据。 Your_ApplicationName
agent.sample_n_per_3_secs 负或零表示关闭,默认情况下。SAMPLE_N_PER_3_SECS 表示在 3 秒内采样 N TraceSegment。 没有设置
agent.authentication Authentication active 是基于后端设置的,更多细节参见application.yml。对于大多数场景,这需要后端扩展,默认实现中只提供基本匹配身份验证。 没有设置
agent.trace_segment_ref_limit_per_span 单个跨度中 TraceSegmentRef 的最大数量,以保持内存成本可估计。 500
agent.span_limit_per_segment 单个段中的最大跨度数。通过此配置项,SkyWalking 可以估算您的应用程序内存成本。 300
agent.ignore_suffix 如果该集合中包含第一个跨度的操作名称,则应忽略该段。 没有设置
agent.is_open_debugging_class 如果为 true,skywalking 代理会将所有检测的类文件保存在/debugging文件夹中。SkyWalking 团队可能会要求提供这些文件以解决兼容问题。 没有设置
agent.is_cache_enhanced_class 如果为 true,SkyWalking 代理会将所有检测的类文件缓存到内存或磁盘文件(由类缓存模式决定),允许另一个 java 代理增强那些由 SkyWalking 代理增强的类。要使用一些 Java 诊断工具(如 BTrace、Arthas)来诊断应用程序或添加自定义 Java 代理以增强类,您需要启用此功能。 false
agent.class_cache_mode 检测类缓存模式:MEMORY或FILE. MEMORY: 将类字节缓存到内存中,如果检测的类过多或过大,可能会占用更多内存。FILE: 在/class-cache文件夹中缓存类字节,在应用程序退出时自动清理缓存的类文件。 MEMORY
agent.instance_name 实例名是一个实例的标识,在服务中应该是唯一的。如果为空,SkyWalking 代理将生成 32 位 uuid。默认情况下,使用UUID@hostname作为实例名称。最大长度为 50(UTF-8 字符) ""
agent.instance_properties[key]=value 添加服务实例自定义属性。 没有设置
agent.cause_exception_depth 代理的深度,何时记录都会导致异常。 5
agent.force_reconnection_period 基于 grpc_channel_check_interval 强制重新连接 grpc 的周期。 1
agent.operation_name_threshold operationName 最大长度,不建议将此值设置为 > 190。 150
agent.keep_tracing 如果此值为 ,即使后端不可用,也要继续跟踪true。 false
agent.force_tls 如果此值为 ,则强制为 gRPC 通道打开 TLS true。 false
agent.ssl_trusted_ca_path gRPC SSL 可信 ca 文件。 /ca/ca.crt
agent.ssl_key_path 私钥文件。当 ssl_key_path 和 ssl_cert_chain_path 存在时启用 mTLS。 ""
agent.ssl_cert_chain_path 证书文件。当 ssl_key_path 和 ssl_cert_chain_path 存在时启用 mTLS。 ""
osinfo.ipv4_list_size 限制 ipv4 列表大小的长度。 10
collector.grpc_channel_check_interval grpc 通道状态检查间隔。 30
collector.heartbeat_period 代理心跳报告期。单位,第二。 30
collector.properties_report_period_factor 所述代理将实例属性到后端每collector.heartbeat_period * collector.properties_report_period_factor秒 10
collector.backend_service 收集器 SkyWalking 跟踪接收器服务地址。 127.0.0.1:11800
collector.grpc_upstream_timeout grpc 客户端将数据发送到上游时会超时多长时间。单位是第二。 30 秒
collector.get_profile_task_interval 嗅探器获取配置文件任务列表间隔。 20
collector.get_agent_dynamic_config_interval 嗅探器获取代理动态配置间隔 20
collector.is_resolve_dns_periodically 如果为 true,skywalking 代理将启用定期解析 DNS 以更新接收器服务地址。 false
logging.level 日志级别:跟踪、调试、信息、警告、错误、关闭。默认为信息。 INFO
logging.file_name 日志文件名。 skywalking-api.log
logging.output 日志输出。默认为文件。使用 CONSOLE 意味着输出到标准输出。 FILE
logging.dir 日志文件目录。默认为空字符串,表示使用“{theSkywalkingAgentJarDir}/logs”输出日志。{theSkywalkingAgentJarDir}为skywalking代理jar文件所在目录 ""
logging.resolver 记录器解析器:PATTERN或JSON. 默认为PATTERN,logging.pattern用于打印传统的文本日志。JSON解析器以 JSON 格式打印日志。 PATTERN
logging.pattern 日志格式。有所有转换说明符: *%level表示日志级别。 * %timestamp表示现在的时间格式yyyy-MM-dd HH:mm:ss:SSS。 * %thread表示当前线程的名称。 * %msg表示用户登录的一些消息。 * %class表示 TargetClass 的 SimpleName。 * %throwable表示用户调用的 throwable。 * %agent_name表示agent.service_name. 仅适用于PatternLogger. %level %timestamp %thread %class : %msg %throwable
logging.max_file_size 日志文件的最大大小。如果大小大于此,则归档当前文件,并写入新文件。 300 * 1024 * 1024
logging.max_history_files 最大历史日志文件。当发生翻转时,如果日志文件超过这个数量,那么最旧的文件将被删除。默认情况下,负数或零表示关闭。 -1
statuscheck.ignored_exceptions 列出的异常不会被视为错误。因为在某些代码中,异常被用作控制业务流程的一种方式。 ""
statuscheck.max_recursive_depth 检查代理跟踪的异常时的最大递归深度。通常,我们不建议将此值设置为超过 10,这可能会导致性能问题。负值和 0 将被忽略,这意味着所有异常都会使跨度标记为错误状态。 1
correlation.element_max_number 关联上下文中的最大元素数。 3
correlation.value_max_length 每个元素的最大值长度。 128
correlation.auto_tag_keys 当此处列出的键存在时,通过关联上下文中的键/值标记跨度。 ""
jvm.buffer_size 收集的 JVM 信息的缓冲区大小。 60 * 10
buffer.channel_size 缓冲区通道大小。 5
buffer.buffer_size 缓冲区大小。 300
profile.active 如果为 true,skywalking 代理将在用户创建新的配置文件任务时启用配置文件。否则禁用配置文件。 true
profile.max_parallel 并行监视器段数 5
profile.duration 最大监控段时间(分钟),如果当前段监控时间超出限制,则停止。 10
profile.dump_max_stack_depth 最大转储线程堆栈深度 500
profile.snapshot_transport_buffer_size 快照传输到后端缓冲区大小 50
meter.active 如果为 true,代理会收集指标并将其报告给后端。 true
meter.report_interval 报告仪表间隔。单位为秒 20
meter.max_meter_size 仪表池的最大大小 500
log.max_message_size 发送到服务器的消息的最大大小。默认为 10 MB。 10485760
plugin.mount 挂载插件的特定文件夹。已安装文件夹中的插件将起作用。 plugins,activations
plugin.peer_max_length 对等最大描述限制。 200
plugin.exclude_plugins 排除插件目录中定义的一些插件。插件名称在代理插件列表中定义 ""
plugin.mongodb.trace_param 如果为true,则跟踪MongoDB访问中的所有参数,默认为false。只跟踪操作,不包括参数。 false
plugin.mongodb.filter_length_limit 如果设置为正数,WriteRequest.params将被截断到这个长度,否则会被完全保存,这可能会导致性能问题。 256
plugin.elasticsearch.trace_dsl 如果为 true,则跟踪 ElasticSearch 访问中的所有 DSL(Domain Specific Language),默认为 false。 false
plugin.springmvc.use_qualified_name_as_endpoint_name 如果为 true,则完全限定的方法名称将用作端点名称而不是请求 URL,默认值为 false。 false
plugin.toolit.use_qualified_name_as_operation_name 如果为 true,则完全限定的方法名称将用作操作名称而不是给定的操作名称,默认为 false。 false
plugin.jdbc.trace_sql_parameters 如果设置为 true,java.sql.PreparedStatement则将收集sql 的参数(通常为)。 false
plugin.jdbc.sql_parameters_max_length 如果设置为正数,db.sql.parameters将被截断到这个长度,否则会被完全保存,这可能会导致性能问题。 512
plugin.jdbc.sql_body_max_length 如果设置为正数,db.statement将被截断到这个长度,否则会被完全保存,这可能会导致性能问题。 2048
plugin.solrj.trace_statement 如果为 true,则跟踪 Solr 查询请求中的所有查询参数(包括 deleteByIds 和 deleteByQuery),默认为 false。 false
plugin.solrj.trace_ops_params 如果为 true,则跟踪 Solr 请求中的所有操作参数,默认为 false。 false
plugin.light4j.trace_handler_chain 如果为 true,则跟踪作为请求的 Light4J 处理程序链一部分的所有中间件/业务处理程序。 错误的
plugin.springtransaction.simplify_transaction_definition_name 如果为 true,则事务定义名称将被简化。 错误的
plugin.jdkthreading.threading_class_prefixes 线程类(java.lang.Runnable和java.util.concurrent.Callable)和它们的子类,包括匿名内部类,它们的名称相匹配的任何一个THREADING_CLASS_PREFIXES(由分裂,)将被仪器,确保只有窄前缀指定为你期待什么样的仪器,(java.和javax.将被忽略由于安全问题) 没有设置
plugin.tomcat.collect_http_params 该配置项控制Tomcat插件是否应该收集请求的参数。此外,在分析跟踪中隐式激活。 false
plugin.springmvc.collect_http_params 这个配置项控制SpringMVC插件是否应该收集请求的参数,当你的Spring应用基于Tomcat时,只考虑设置plugin.tomcat.collect_http_params或plugin.springmvc.collect_http_params。此外,在分析跟踪中隐式激活。 false
plugin.httpclient.collect_http_params 这个配置项控制HttpClient插件是否应该收集请求的参数 false
plugin.http.http_params_length_threshold 当COLLECT_HTTP_PARAMS启用时,有多少个字符,以保持并传送到后端OAP,使用负值,以保持和发送完整的参数,NB。添加此配置项是为了性能。 1024
plugin.http.http_headers_length_threshold 当include_http_headers声明的标题名称,该阈值控制所有标头值的长度的限制。使用负值来保存和发送完整的标头。笔记。添加此配置项是为了性能。 2048
plugin.http.include_http_headers 设置标题名称,应由插件收集。标题名称必须遵循javax.servlet.http定义。多个名称应以逗号分隔。 ``(不会收集标题) |
plugin.feign.collect_request_body 此配置项控制 Feign 插件是否应收集请求的 http 正文。 false
plugin.feign.filter_length_limit 当COLLECT_REQUEST_BODY启用时,有多少个字符,以保持并传送到后端OAP,使用负值,以保持和发送完整的身体。 1024
plugin.feign.supported_content_types_prefix 当COLLECT_REQUEST_BODY启用并且内容类型以 SUPPORTED_CONTENT_TYPES_PREFIX 开头时,收集请求的正文,多个路径应以, application/json,text/
plugin.influxdb.trace_influxql 如果为 true,则跟踪 InfluxDB 访问中的所有 influxql(查询和写入),默认为 true。 true
plugin.dubbo.collect_consumer_arguments Apache Dubbo 消费者arguments在 RPC 调用Object#toString中收集,用于收集arguments. false
plugin.dubbo.consumer_arguments_length_threshold 当plugin.dubbo.collect_consumer_arguments是时true,从前端到 OAP 后端的长度参数 256
plugin.dubbo.collect_provider_arguments Apache Dubbo 提供程序arguments在 RPC 调用Object#toString中收集,用于收集arguments. false
plugin.dubbo.provider_arguments_length_threshold 当plugin.dubbo.collect_provider_arguments是时true,从前端到 OAP 后端的长度参数 256
plugin.kafka.bootstrap_servers 用于建立与 Kafka 集群的初始连接的主机/端口对列表。 localhost:9092
plugin.kafka.get_topic_timeout 从Kafka服务器读取topic的超时时间,单位为秒。 10
plugin.kafka.producer_config Kafka生产者配置。阅读生产者配置以获取更多详细信息。查看Kafka 报告文档以获取更多详细信息和示例。
plugin.kafka.producer_config_json 以 JSON 格式配置 Kafka Producer 配置。请注意plugin.kafka.producer_config[key],如果密钥重复,它将被 , 覆盖。
plugin.kafka.topic_meter 指定仪表系统数据要报告给哪个 Kafka 主题名称。 skywalking-meters
plugin.kafka.topic_metrics 指定要向其报告 JVM 指标数据的 Kafka 主题名称。 skywalking-metrics
plugin.kafka.topic_segment 指定要向其报告的跟踪数据的 Kafka 主题名称。 skywalking-segments
plugin.kafka.topic_profiling 指定要向其报告的线程分析快照的 Kafka 主题名称。 skywalking-profilings
plugin.kafka.topic_management 指定服务实例的注册数据或心跳数据上报到哪个Kafka主题名。 skywalking-managements
plugin.kafka.topic_logging 指定要向其报告的日志数据的 Kafka 主题名称。 skywalking-logging
plugin.kafka.namespace 使用相同的 Kafka 集群时隔离多个 OAP 服务器(最终主题名称将在 Kafka 主题之前附加命名空间-)。 `` |
plugin.springannotation.classname_match_regex 将 spring beans 与类名的正则表达式匹配。多个表达式可以用逗号分隔。这仅在Spring annotation plugin已激活时有效。 All the spring beans tagged with @Bean,@Service,@Dao, or @Repository.
plugin.toolkit.log.transmit_formatted 是否以格式化或未格式化的形式传输记录数据。 true
plugin.lettuce.trace_redis_parameters 如果设置为true,Redis 命令的参数将由Lettuce 代理收集。 false
plugin.lettuce.redis_parameter_max_length 如果设置为正数并plugin.lettuce.trace_redis_parameters设置为true,Redis 命令参数将被收集并截断到此长度。 128
plugin.neo4j.trace_cypher_parameters 如果设置为true,将收集密码的参数。 false
plugin.neo4j.cypher_parameters_max_length 如果设置为正数,db.cypher.parameters将被截断到这个长度,否则会被完全保存,这可能会导致性能问题。 512
plugin.neo4j.cypher_body_max_length 如果设置为正数,db.statement将被截断到这个长度,否则会被完全保存,这可能会导致性能问题。 2048

关键参数

属性名 描述 设置值
agent.namespace SkyWalking是一个监控工具,会从分布式系统中收集度量值。在真实世界中,大型分布式系统包含了成百上千的服务和服务实例。在这种情况下,很有可能不止一个小组,甚至不止一个公司在维护和监控分布式系统。每个小组或公司掌管着不同的部分,他们不希望也不应该共享他们的度量值。命名空间正是基于以上背景提出的,用于追踪监控系统的隔离 Skywalking的默认header的key是sw6,当设置agent.namespace之后,header的key变为设置的namespace+“sw6”。例如namespace为test,则header的key为test-sw6。
agent.service_name 服务名称=[{服务名称} = [服务名称=[{组名称}::]${逻辑名称} APP_ID
agent.sample_n_per_3_secs 负数或0表示不采样,默认不采样。SAMPLE_N_PER_3_SECS表示每3秒采样30条。 30
logging.level 日志级别 info
logging.max_file_size 日志文件的最大大小。当日志文件大小超过这个数,归档当前的日志文件,将日志写入到新文件 104857600(100M)
logging.max_history_files 最大历史记录日志文件。发生翻转时,如果日志文件超过此数目,则最早的文件将被删除。 2

集成

-Dspring.profiles.active=prod -Djava.security.egd=file:/dev/./urandom -Xms187M -Xmx3006M -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/data/app/logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=100m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/app/logs/oom.hprof -XX:ErrorFile=/data/app/logs/hs_err_%p.log -javaagent:/usr/local/agents/skywalking/skywalking-agent.jar -DSW_AGENT_NAME=td-ba-coding-devops-guide-prod -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-oap.teddymobile.net:11800 -javaagent:/usr/local/agents/prometheus/jmx_prometheus_javaagent-0.14.0.jar=9091:/usr/local/agents/prometheus/jmx_exporter.yml

关键参数

属性名 描述 设置值
SW_AGENT_NAME 指定微服务实例名称,用于展示在SkyWalking的web监控界面 td-xx-xx-prod
SW_AGENT_COLLECTOR_BACKEND_SERVICE skywalking后端接收服务 skywalking-oapa.teddymobile.net:11800

其中,-javaagent参数指定skywalking-agent.jar的全路径

Toolkit

image.png

toolkit-trace

  • 依赖工具包,比如使用maven或者gradle
   <dependency>
      <groupId>org.apache.skywalking</groupId>
      <artifactId>apm-toolkit-trace</artifactId>
      <version>${skywalking.version}</version>
   </dependency>
  • 通过TraceContext.traceId()API获取traceId。
import TraceContext;
...

modelAndView.addObject("traceId", TraceContext.traceId());
  • 使用TraceContext.segmentId()API 获取segmentId。
import TraceContext;
...

modelAndView.addObject("segmentId", TraceContext.segmentId());
  • 使用TraceContext.spanId()API 获取spanId。
import TraceContext;
...

modelAndView.addObject("spanId", TraceContext.spanId());

仅示例代码

  • 添加@Trace到您要跟踪的任何方法。之后,您可以在堆栈中看到跨度。
  • 带有注释的方法@Tag将尝试使用给定的键 ( ) 和 ( )标记当前活动跨度,如果根本没有活动跨度,则此注释无效。可以重复,并且可以与 一起使用,请参见下面的示例。该的是一样的东西在支持自定义增强跟踪。Tag#key()``Tag#value()``@Tag``@Trace``value``Tag
  • 在跟踪方法的上下文中添加自定义标记,ActiveSpan.tag("key", "val").
  • ActiveSpan.error() 将当前跨度标记为错误状态。
  • ActiveSpan.error(String errorMsg) 使用消息将当前跨度标记为错误状态。
  • ActiveSpan.error(Throwable throwable) 使用 Throwable 将当前跨度标记为错误状态。
  • ActiveSpan.debug(String debugMsg) 在当前跨度中添加调试级别日志消息。
  • ActiveSpan.info(String infoMsg) 在当前跨度中添加信息级别日志消息。
  • ActiveSpan.setOperationName(String operationName) 自定义操作名称。
ActiveSpan.tag("my_tag", "my_value");
ActiveSpan.error();
ActiveSpan.error("Test-Error-Reason");

ActiveSpan.error(new RuntimeException("Test-Error-Throwable"));
ActiveSpan.info("Test-Info-Msg");
ActiveSpan.debug("Test-debug-Msg");

/**
 * The codes below will generate a span,
 * and two types of tags, 
      one type tag: keys are `tag1` and `tag2`, values are the passed-in parameters, respectively, 
      the other type tag: keys are `username`  and `age`, values are the return value in User, respectively
 */
@Trace
@Tag(key = "tag1", value = "arg[0]")
@Tag(key = "tag2", value = "arg[1]")
@Tag(key = "username", value = "returnedObj.username")
@Tag(key = "age", value = "returnedObj.age")
public User methodYouWantToTrace(String param1, String param2) {
    // ActiveSpan.setOperationName("Customize your own operation name, if this is an entry span, this would be an endpoint name");
    // ...
}
  • 使用TraceContext.putCorrelation()API 将自定义数据放入跟踪上下文中。
Optional<String> previous = TraceContext.putCorrelation("customKey", "customValue");

当值为null或为空时,CorrelationContext 将删除该项目。

  • 使用TraceContext.getCorrelation()API 获取自定义数据。
Optional<String> value = TraceContext.getCorrelation("customKey");

CorrelationContext 配置描述可以在代理配置文档中找到,correlation.前缀为。

跨线程追踪

  • 用法 1.
    @TraceCrossThread
    public static class MyCallable<String> implements Callable<String> {
        @Override
        public String call() throws Exception {
            return null;
        }
    }
...
    ExecutorService executorService = Executors.newFixedThreadPool(1);
    executorService.submit(new MyCallable());
  • 用法 2.
    ExecutorService executorService = Executors.newFixedThreadPool(1);
    executorService.submit(CallableWrapper.of(new Callable<String>() {
        @Override public String call() throws Exception {
            return null;
        }
    }));

或者

    ExecutorService executorService = Executors.newFixedThreadPool(1);
    executorService.execute(RunnableWrapper.of(new Runnable() {
        @Override public void run() {
            //your code
        }
    }));
  • 用法 3.
    @TraceCrossThread
    public class MySupplier<String> implements Supplier<String> {
        @Override
        public String get() {
            return null;
        }
    }
...
    CompletableFuture.supplyAsync(new MySupplier<String>());

或者

    CompletableFuture.supplyAsync(SupplierWrapper.of(()->{
            return "SupplierWrapper";
    })).thenAccept(System.out::println);

toolkit-logback

  • 依赖工具包,比如使用maven或者gradle
    <dependency>
         <groupId>org.apache.skywalking</groupId>
         <artifactId>apm-toolkit-logback-1.x</artifactId>
         <version>{project.release.version}</version>
     </dependency>

在日志中打印跟踪 ID

  • 设置%tid在Patternlogback.xml的部分
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>
  • 使用 MDC,%X{tid}在Patternlogback.xml 的部分中设置
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>
  • 支持 logback AsyncAppender(MDC 也支持),无需额外配置。参考下面logback.xml的demo。详情:Logback AsyncAppender
    <configuration scan="true" scanPeriod=" 5 seconds">
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
                <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                    <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
                </layout>
            </encoder>
        </appender>
    
        <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
            <discardingThreshold>0</discardingThreshold>
            <queueSize>1024</queueSize>
            <neverBlock>true</neverBlock>
            <appender-ref ref="STDOUT"/>
        </appender>
    
        <root level="INFO">
            <appender-ref ref="ASYNC"/>
        </root>
    </configuration>
  • 当您使用-javaagent激活 SkyWalking 跟踪器时,如果存在,logback 将输出traceId。如果跟踪器处于非活动状态,则输出将为TID: N/A。

FAQ

是否能在skywalking中自定义traceid

不能,详见:https://github.com/apache/skywalking/issues/1941

# apm
Redis阻塞排查
Skywalking集成
  • 文章目录
  • 站点概览
lw‘Blogs

lw‘Blogs

自信人生二百年,会当水击三千里

80 日志
8 分类
40 标签
RSS
Github E-mail
Creative Commons
© 2025 京ICP备2022025426号-1