内容抄书而来,感谢《Apache SkyWalking实战》书籍作者,刚开始记录,之后会加上感悟与code,最后只会留下感悟与code:
知道的都说了,随便转,随便喷,想要的你们带走,别打扰我自言自语。
一、配置覆盖
Skywalking(下文有时简写为SW),提供了agent.config配置文件,做为全局的配置;但是还是可以选择一些方式,覆盖binary文件中的配置信息。
配置优先级如下:
探针参数 > 系统属性 > 系统环境变量 > 配置文件
-
探针参数:
格式:
-javaagent:/path/to/skywalking-agent.jar=[option1]=[value1],[option2]=[value2]
应用场景:
现实的场景里,我们会在各个环境中,比如生产环境,修改特定环境的配置,比如,开发人员会在开发环境设置好大部分的生产配置,而有些开发人员无法接触到的特殊生产信息,运维角色的管理员,有必要修改,比如生产部署机器的端口覆盖。
-
系统属性
格式:
skywalking + agent.config中属性名
应用场景:
类似于探针属性,更接近开发人员的习惯,特别指定某一属性。
例子:
-Dskywalking.agent.service_name=sw-demo
-
系统环境变量
格式:
SW有很多SW开头的系统属性配置,如下表:
应用场景:
初始化一个环境,我们想配置一个环境,并提供一定的默认值,可以先用统一的环境初始化脚本,对环境初始化一遍。
属性 | 环境变量 | 默认值 | 说明 |
---|---|---|---|
agent.namespace | SW_AGENT_NAMESPACE | default-namespace | 命名空间 |
agent.service_name | SW_AGENT_NAME | 服务名 | |
agent.sample_n_per_3_secs | SW_AGENT_SAMPLE | -1 | 每3秒采样数量,负数表示尽可能多的采集数据 |
agent.authentication | SW_AGENT_AUTHENTICATION | 认证信息,需结合oap application.yaml中配置 | |
agent.span_limit_per_segment | SW_AGENT_SPAN_LIMIT | 300 | 单个segment中最大spans数,sw通过这项配置预估应用内存消耗 |
agent.ignore_suffix | SW_AGENT_IGNORE_SUFFIX | 需要忽略的采样数据后缀,如设置为:”.jpg,.js,.css” | |
agent.is_open_debugging_class | SW_AGENT_OPEN_DEBUG | true | 启用后sw将保存instrumented classes 到 /debugging 目录,sw团队可能会申请使用这个文件来解决问题 |
agent.operation_name_threshold | SW_AGENT_OPERATION_NAME_THRESHOLD | 500 | operationName的最大长度 |
collector.backend_service | SW_AGENT_COLLECTOR_BACKEND_SERVICES | 127.0.0.1:11800 | OAP 后端 endpoint |
logging.file_name | SW_LOGGING_FILE_NAME | skywalking-api.log | 日志文件名 |
logging.level | SW_LOGGING_LEVEL | DEBUG | 日志级别 |
logging.dir | SW_LOGGING_DIR | “” | 日志目录 |
logging.max_file_size | SW_LOGGING_MAX_FILE_SIZE | 314572800 | 日志文件大小,默认300M |
logging.max_history_files | SW_LOGGING_MAX_HISTORY_FILES | -1 | 最大历史日志文件数量 |
plugin.mysql.trace_sql_parameters | SW_MYSQL_TRACE_SQL_PARAMETERS | false |
二、自定义配置文件
如果同一个skywalking安装实例,监控多个不同应用时,可能需要不同配置文件,我们就用上面提到的系统属性来指定特定配置文件:
-Dskywalking_cofig=/path/to/cust_agent.config
指定agent的配置文件,优先级会高于默认的配置文件(agent.config)
三、客户端采样
为了固定设置对应用增加的负载,我们可以设置单位时间内采样的数量,这时候需要用到参数agent.sample_n_per_3_secs。代表每三秒采样的次数。
例子:
agent.sample_n_per_3_secs=400,代表每三秒采样400次。
四、TLS
agent端采集的数据,可能会有敏感信息,所以需要加密传输到采集器中,skywalking会通过gRPC TLS来保证通信安全。其鉴权模式只支持no mutual auth。
开启方法:
通过SW自带脚本生成ca.crt、server.crt和server.pem
开启并配置TLS:
配置分agent端和服务端:
agent端配置:
讲ca.crt放在agent目录下的/ca目录中,ca目录需自己创建;当agent检测到/ca/ca.crt后,会自动开启TLS。
服务端配置:
将application.yml/core/default的TLS配置设置为如下:
gRPCSslEnabled: ${SW_CORE_GRPC_SSL_ENABLED:true}
gRPCSslKeyPath: ${SW_CORE_GRPC_SSL_KEY_PATH:"/path/to/server.prem"}
gRPCSslCertChainPath: ${SW_CORE_GRPC_SSL_CERT_CHAIN_PATH:"/path/to/server.crt"}
gRPCSslTrustedCAPath: ${SW_CORE_GRPC_SSL_TRUSTED_CA_PATH:"/path/to/ca.crt"}
五、命名空间
收集器以及监控阈值可能根据不同公司不同,所以需要不同的命名空间。
设置配置agent.skywaling=命名空间。
修改后会对header有影响,默认的header的key位sw6,修改命名空间后,header变为:namespace+ -sw6
六、Application Tookit API
-
如何在日志中打印Trace上下文:
在SW子工程apm-application-toolkit里有如下模块:
apm-toolkit-log4j-1.x
apm-toolkit-log4j-2.x
apm-toolkit-logback-1.x
apm-toolkit-meter
apm-toolkit-micrometer-registry
apm-toolkit-opentracing
apm-toolkit-trace
前三个就是目前支持的日志模块。
友人提醒我是通过Slf4j MDC机制实现的,特别去看了下是怎么回事,果真有点意思。咱们就挑logback开始聊:
如果要在应用日志中打印出trace id,要走几步:
第一:引入依赖
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.0.1</version>
</dependency>
第二:
修改logback.xml,指定layout的class位SW提供的layout类型,并且在模板中增加tid的锚点。
<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] .....</Pattern>
</layout>
</encoder>
</appender>
首先这个layout类代码并不多,我们贴出来分析一下,SW用LogbackMDCPatternConverter类覆写了logback里的MDCConverter,成功替换了自己的实现:
看看logback的PatternLayout里熟悉配方以及MDC的模板埋点:
SW是如何覆写MDCConverter,看来还是有很多关子(TODO:感觉要绕到logback中):
其实我最后还有一个疑问留作TODO项,之后来解析:
SW提供了两个layout类型:org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout
还有一个是org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout
看来一定要深入了解下logback的源码,把这个框架摸清楚。
-
如何通过注解或SkyWalking的本地API读取/补充Trace上下文 -
trace的跨线程传递 -
如何使用OpeningTracing API
先抄书抄到这,之后继续。