Skywalking
什么是Skywalking
SkyWalking是一个针对分布式系统的应用性能监控(ApplicationPerformanceMonitor,APM)和可观测性分析平台(ObservabilityAnalysisPlatform)。它提供了多维度应用性能分析手段,从分布式拓扑图到应用性能指标、Trace、日志的关联分析与告警
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架构设计
- 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
追踪
- 跟踪段列表与跟踪列表不同。每个跟踪都有几个属于不同服务的段。如果您按所有服务或按跟踪 ID 启动查询,则可能会在此处列出具有相同跟踪 ID 的不同段。
- 可以点击跨度。每个跨度的详细信息将在左侧弹出。
- Trace Views提供了三种典型且不同的使用视图来可视化跟踪。
后端
基础设置
服务分组
SkyWalking 支持各种默认和自定义的仪表板模板。每个模板都为特定领域的服务提供了适当的布局。
因此,从 8.3.0 版本开始,SkyWalking OAP 基于这种简单的命名格式生成了组:
{组名称}::]${逻辑名称}
集群管理
在很多产品环境中,后端需要支持高吞吐量并提供HA来保持健壮性,所以你总是需要在产品环境中进行集群管理。
注意,集群管理不为代理和探针提供服务发现机制。我们建议代理/探针使用网关到负载均衡器来访问 OAP 集群。
集群管理的核心特性是支持整个 OAP 集群运行分布式聚合和分析遥测数据。
多种方式支持后端管理集群:
后端存储
- H2
- OpenSearch
- ElasticSearch 6, 7
- MySQL
- TiDB
- InfluxDB
- PostgreSQL
数据过期设置
在 SkyWalking 中,有两种类型的可观测性数据:
- 记录包括跟踪、日志、topN 采样语句和警报。
recordDataTTL
适用于记录数据。 - 指标包括服务、实例、端点和拓扑图的所有指标。元数据(服务、实例或端点列表)也属于指标。
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)收集日志。有关更多详细信息,请参阅日志分析器文档。
健康检查
健康检查旨在提供一种独特的方法来检查 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
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
在Pattern
logback.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}
在Pattern
logback.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
。