Spring Cloud Alibaba 集成 Skywalking 链路追踪

Spring Cloud Alibaba 集成 Skywalking 链路追踪

简介

skywalking 是一个国产开源框架,2015 年由吴晟开源 , 2017 年加入 Apache 孵化器。skywalking 是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

官网:http://skywalking.apache.org/

OpenTracing 的组织,旨在推进调用链监控的一些规范和标准工作。

  • SkyWalking 是一个开源监控平台,用于从服务和云原生基础设施收集、分析、聚合和可视化数据。
  • SkyWalking 提供了一种简单的方法来维护分布式系统的清晰视图,甚至可以跨云查看。它是一种现代APM,专门为云原生、基于容器的分布式系统设计。
  • SkyWalking 从三个维度对应用进行监视:service(服务), service instance(实例), endpoint(端点)。服务和实例就不多说了,端点是服务中的某个路径或者说URI。
  • SkyWalking 允许用户了解服务和端点之间的拓扑关系,查看每个服务/服务实例/端点的度量,并设置警报规则。

选型

  1. Zipkin 是 Twitter 开源的调用链分析工具,目前基于 springcloud sleuth 得到了广泛的使用,特点是轻量,使用部署简单。
  2. Pinpoint 是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI 功能强大,接入端无代码侵入。
  3. SkyWalking 是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI 功能较强,接入端无代码侵入。目前已加入 Apache 孵化器。
  4. CAT 是大众点评开源的基于编码和配置的调用链分析,应用监控分析,日志采集,监控报警等一系列的监控平台工具。

链路追踪框架对比

项目CatZipkinSkywalking
调用可视化
聚合报表非常丰富较丰富
服务依赖图简单简单
埋点方式侵入式侵入式非侵入,字节码加强
VM监控指标
支持语言java/.net丰富java/.net/nodejs/php/go
存储机制mysql/本地文件/HDFS内存/ES/mysqlh2/mysql/es/tidb
社区支持国内国外Apache支持
使用案例美团、携程、陆金所京东、阿里华为、小米、当当、微众银行
APM
开发基础eBay calGoogle DapperGoogle Dapper
是否支持webflux
github stars12.3K12.2K18K

主要功能

  • 多种监控手段。可以通过语言探针和 service mesh 获得监控是数据。
  • 多个语言自动探针。包括 Java,.NET Core 和 Node.JS。
  • 轻量高效。无需大数据平台,和大量的服务器资源。
  • 模块化。UI、存储、集群管理都有多种机制可选。
  • 支持告警。
  • 优秀的可视化解决方案。

组成

SkyWalking主要的几个组成模块:

  • Agent(探针 ) 主要负责从系统中采集各种指标,链路数据,发送给 oap 服务。
  • oap 服务接收 Agent 发送过来的数据,存储,执行分析,提供查询和报警功能。
  • Storage 和 UI 负责存储数据以及查看数据。

构建后包括Skywalking后端和Web UI的目录:

├── bin
├── config
├── config-examples
├── LICENSE
├── licenses
├── logs
├── NOTICE
├── oap-libs
├── README.txt
├── tools
└── webapp

SkyWalking 整体架构如何?

整个架构,分成上、下、左、右四部分:

考虑到让描述更简单,我们舍弃掉 Metric 指标相关,而着重在 Tracing 链路相关功能。

  • 上部分 Agent :负责从应用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器。
  • 下部分 SkyWalking OAP :负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能。
  • 右部分 Storage :Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。
  • 左部分 SkyWalking UI :负责提供控台,查看链路等等。

部署前提

目前阿里等云厂商也有各种Sass服务

官网新版的都是源码,需要自己去构建

  • JDK 8+
  • MySQL/Elasticsearch,(mysql 启动需要下载对应的jar包到/oap-libs)
  • 服务器内存 2G +

服务端部署

服务 包括以下部分

  • OAP server
  • OAP ui

修改配置项

  • 创建库 swtest
DROP DATABASE IF EXISTS `swtest`;
CREATEDATABASE  `swtest` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • 修改application.yaml
storage:selector: ${SW_STORAGE:mysql}mysql:properties:jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://xxx:3306/swtest?rewriteBatchedStatements=true"}dataSource.user: ${SW_DATA_SOURCE_USER:root}dataSource.password: ${SW_DATA_SOURCE_PASSWORD:xxx}

三种运行方式

  • 单服务直接启动
  • docker 部署
  • docker-compose 部署

单服务启动

skywalking国内下载:

https://mirrors.cloud.tencent.com/apache/skywalking

https://archive.apache.org/dist/skywalking/

./startup.shwget http://maven.aliyun.com/nexus/content/groups/public/mysql/mysql-connector-java/5.1.48/mysql-connector-java-5.1.48.jarwget http://maven.aliyun.com/nexus/content/groups/public/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar

docker 启动

**镜像地址:**https://hub.docker.com/r/apache/skywalking-java-agent

  • oap + mysql 需要自己设置镜像
docker run --name oap -d --restart always \
-p 11800:11800 \
-p 12800:12800 \
-e SW_STORAGE=mysql \
-e "SW_JDBC_URL=jdbc:mysql://xxx:3306/swtest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true" \
-e SW_DATA_SOURCE_USER=root \
-e SW_DATA_SOURCE_PASSWORD=xpccyc_2022 \
apache/skywalking-oap-server:8.9.1
  • oap + elasticsearch
docker run --name oap -d --restart always \
-e TZ=Asia/Shanghai \
-p 12800:12800 \
-p 11800:11800 \
--link elasticsearch:elasticsearch \
-e SW_STORAGE=elasticsearch \
-e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 \
apache/skywalking-oap-server:6.6.0-es7
  • UI 启动
docker run -d --name oap-ui \
--restart=always \
-e TZ=Asia/Shanghai \
-p 8868:8080 \
--link oap:oap \
-e SW_OAP_ADDRESS=http://xxx:12800 \
apache/skywalking-ui

docker-compose 部署

  1. elasticsearch 作为 skywalking 的存储,保存链路和日志数据等
  2. oap 数据接收和分析 Observability Analysis Platform
  3. ui web端的数据展示
# 创建配置文件保存的目录
mkdir -p /data/docker/admin/skywalking
# 切换到刚创建的目录
cd /data/docker/admin/skywalking
# 将下面的 docker-compose.yml 文件保存到这个目录
vi docker-compose.yml
# 拉去镜像并启动
docker-compose up -d
# 查看日志
docker-compose logs -f

docker-compose.yml

version: '3.8'
services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:7.14.1container_name: elasticsearchrestart: alwaysports:- 9200:9200healthcheck:test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]interval: 30stimeout: 10sretries: 3start_period: 40senvironment:- discovery.type=single-node- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms512m -Xmx512m"- TZ=Asia/Shanghaiulimits:memlock:soft: -1hard: -1oap:image: apache/skywalking-oap-server:8.7.0-es7container_name: oapdepends_on:- elasticsearchlinks:- elasticsearchrestart: alwaysports:- 11800:11800- 12800:12800healthcheck:test: ["CMD-SHELL", "/skywalking/bin/swctl"]interval: 30stimeout: 10sretries: 3start_period: 40senvironment:TZ: Asia/ShanghaiSW_STORAGE: elasticsearch7SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200ui:image: apache/skywalking-ui:8.7.0container_name: uidepends_on:- oaplinks:- oaprestart: alwaysports:- 8088:8080environment:TZ: Asia/ShanghaiSW_OAP_ADDRESS: http://oap:12800

访问

http://IP:8080

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TcTYQ9d2-1689842932926)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220915191747007.png)]

微服务集成

通过设置启动脚本添加请求启动参数,字节码注入的方式

agent发行包包含在Apache官方发行版中。最新的agent包结构如下。

+-- agent+-- activationsapm-toolkit-log4j-1.x-activation.jarapm-toolkit-log4j-2.x-activation.jarapm-toolkit-logback-1.x-activation.jar...+-- configagent.config  +-- pluginsapm-dubbo-plugin.jarapm-feign-default-http-9.x.jarapm-httpClient-4.x-plugin.jar.....+-- optional-pluginsapm-gson-2.x-plugin.jar.....+-- bootstrap-pluginsjdk-http-plugin.jar.....+-- logsskywalking-agent.jar
  • 下载

skywalking的java agent迁移到了新仓库

https://github.com/apache/skywalking-java

下载后使用idea打开

新版:需要下载源码自己打包获取skywalking-agent.jar

有一些proto的文件需要生成,使用如下命令行编译生成

mvn clean package -DskipTests

老版:https://archive.apache.org/dist/skywalking/8.2.0/apache-skywalking-apm-8.2.0.tar.gz

  • 启动脚本
    nohup java -javaagent:/data/init/skywalking-agent.jar \-Dskywalking.agent.service_name=${ENV}::$SERVER_NAME \-Dskywalking.collector.backend_service=10.32.120.156:11800 \-jar -Xms256m -Xmx512m -Dspring.profiles.active=${ENV}  $JAR_NAME  >> /data/project/$SERVER_NAME/info.log 2>&1 &

老版本:注意:此处存在 bug,跟踪链路不显示 gateway

拷贝 skywalking-agent/optional-plugins 目录下的 gateway 插件到 agent/plugins 目录

自定义链路追踪

如果我们希望对项目中的业务方法实现链路追踪,方便排查问题,可以导入如下依赖版本号尽量和skywalking保持一致

它可以将任意业务方法加入到skywalkingUI界面中的链路追踪,可以看到自定义的链路节点耗费时间并包括参数返回值等常规信息

<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>${skywalking.version}</version>
</dependency>

代码中使用traceId

@RequestMapping("/list")
public List<User> list(){//TraceContext可以绑定key-valueTraceContext.putCorrelation("name", "fox");Optional<String> op = TraceContext.getCorrelation("name");log.info("name = {} ", op.get());//获取跟踪的traceIdString traceId = TraceContext.traceId();log.info("traceId = {} ", traceId);return userService.list();
}

@Trace 将方法加入追踪链路

如果一个业务方法想在 ui 界面的跟踪链路上显示出来,只需要在业务方法上加上 @Trace 注解即可

我们还可以为追踪链路增加其他额外的信息,比如记录参数和返回信息。实现方式:在方法上增加 @Tag 或者 @Tags。

@Trace
@Tag(key = "list", value = "returnedObj")
public List<User> list(){    return userMapper.list();
}@Trace
@Tags({@Tag(key = "param", value = "arg[0]"),        
@Tag(key = "user", value = "returnedObj")})
public User getById(Integer id){    return userMapper.getById(id);
}

日志

我们需要在日志中记录下来每次请求的唯一标识(trace-id),这样就可以在SkyWalking定位到有问题的trace-id,然后通过这个trace-id我们就可以通过日志系统去定位到相关的日志,从而发现并解决问题。

引入apm-toolkit-logback-1.x依赖

<dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>${skywalking.version}</version>
</dependency>

日志配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false"><!-- 日志存放路径 --><property name="log.path" value="logs"/><!-- 日志输出格式 --><property name="log.pattern"value="%d{HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 系统日志输出 --><appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/info.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 10天 --><maxHistory>10</maxHistory></rollingPolicy><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><pattern>${log.pattern}</pattern></layout></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>INFO</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/error.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史30天 --><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>ERROR</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- 系统模块日志级别控制  --><logger name="com.idea" level="info"/><!-- Spring日志级别控制  --><logger name="org.springframework" level="warn"/><!--系统操作日志--><root level="info"><appender-ref ref="console"/><appender-ref ref="file_info"/><appender-ref ref="file_error"/></root></configuration>

打开 agent/config/agent.config 配置文件,添加如下配置信息:

plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:192.168.3.100}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}

复制代码

以上配置是默认配置信息,agent 与 oap 在本地的可以不配

告警

Apache SkyWalking告警是由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中。

告警规则的定义分为三部分。

  1. 告警规则:定义了触发告警所考虑的条件。
  2. webhook:当告警触发时,被调用的服务端点列表。
  3. gRPCHook:当告警触发时,被调用的远程gRPC方法的主机和端口。
  4. Slack Chat Hook:当告警触发时,被调用的Slack Chat接口。
  5. 微信 Hook:当告警触发时,被调用的微信接口。
  6. 钉钉 Hook:当告警触发时,被调用的钉钉接口。

告警规则

告警规则有两种类型,单独规则(Individual Rules)和复合规则(Composite Rules),复合规则是单独规则的组合。

单独规则(Individual Rules)

单独规则主要有以下几点:

  • 规则名称:在告警信息中显示的唯一名称,必须以_rule结尾。
  • metrics-name:度量名称,也是OAL脚本中的度量名。默认配置中可以用于告警的度量有:服务实例端点服务关系实例关系端点关系。它只支持long,double和int类型。
  • include-names:包含在此规则之内的实体名称列表。
  • exclude-names:排除在此规则以外的实体名称列表。
  • include-names-regex:提供一个正则表达式来包含实体名称。如果同时设置包含名称列表和包含名称的正则表达式,则两个规则都将生效。
  • exclude-names-regex:提供一个正则表达式来排除实体名称。如果同时设置排除名称列表和排除名称的正则表达式,则两个规则都将生效。
  • include-labels:包含在此规则之内的标签。
  • exclude-labels:排除在此规则以外的标签。
  • include-labels-regex:提供一个正则表达式来包含标签。如果同时设置包含标签列表和包含标签的正则表达式,则两个规则都将生效。
  • exclude-labels-regex:提供一个正则表达式来排除标签。如果同时设置排除标签列表和排除标签的正则表达式,则两个规则都将生效。

标签的设置必须把数据存储在meter-system中,例如:Prometheus, Micrometer。以上四个标签设置必须实现LabeledValueHolder接口。

  • threshold:阈值。

对于多个值指标,例如percentile,阈值是一个数组。像value1 value2 value3 value4 value5这样描述。
每个值可以作为度量中每个值的阈值。如果不想通过此值或某些值触发警报,则将值设置为 -
例如在percentile中,value1是P50的阈值,value2是P75的阈值,那么-,-,value3, value4, value5的意思是,没有阈值的P50和P75的percentile告警规则。

  • op:操作符,支持>, >=, <, <=, =
  • period:多久告警规则需要被检查一下。这是一个时间窗口,与后端部署环境时间相匹配。
  • count:在一个周期窗口中,如果按op计算超过阈值的次数达到count,则发送告警。
  • only-as-conditiontrue或者false,指定规则是否可以发送告警,或者仅作为复合规则的条件。
  • silence-period:在时间N中触发报警后,在N -> N + silence-period这段时间内不告警。 默认情况下,它和period一样,这意味着相同的告警(同一个度量名称拥有相同的Id)在同一个周期内只会触发一次。
  • message:该规则触发时,发送的通知消息。

举个例子:

rules:service_resp_time_rule:metrics-name: service_resp_timeop: ">"threshold: 1000period: 10count: 2silence-period: 10message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒service_instance_resp_time_rule:metrics-name: service_instance_resp_timeop: ">"threshold: 1000period: 10count: 2silence-period: 10message: 实例【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒endpoint_resp_time_rule:metrics-name: endpoint_avgthreshold: 1000op: ">"period: 10count: 2message: 端点【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒
复合规则(Composite Rules)

复合规则仅适用于针对相同实体级别的告警规则,例如都是服务级别的告警规则:service_percent_rule && service_resp_time_percentile_rule
不可以编写不同实体级别的告警规则,例如服务级别的一个告警规则和端点级别的一个规则:service_percent_rule && endpoint_percent_rule

复合规则主要有以下几点:

  • 规则名称:在告警信息中显示的唯一名称,必须以_rule结尾。
  • expression:指定如何组成规则,支持&&, ||, ()操作符。
  • message:该规则触发时,发送的通知消息。

举个例子:

rules:service_resp_time_rule:metrics-name: service_resp_timeop: ">"threshold: 1000period: 10count: 2silence-period: 10message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒service_sla_rule:metrics-name: service_slaop: "<"threshold: 8000period: 10count: 2silence-period: 10message: 服务【{name}】的成功率在最近10分钟内有2分钟低于80%
composite-rules:comp_rule:expression: service_resp_time_rule && service_sla_rulemessage: 服务【{name}】在最近10分钟内有2分钟超过1秒平均响应时间超过1秒并且成功率低于80%

Webhook

Webhook 要求一个点对点的 Web 容器。告警的消息会通过 HTTP 请求进行发送,请求方法为 POSTContent-Typeapplication/json,JSON 格式包含以下信息:

  • scopeId:目标 Scope 的 ID。
  • name:目标 Scope 的实体名称。
  • id0:Scope 实体的 ID。
  • id1:未使用。
  • ruleName:您在 alarm-settings.yml 中配置的规则名。
  • alarmMessage. 告警消息内容。
  • startTime. 告警时间戳,当前时间与 UTC 1970/1/1 相差的毫秒数。

举个例子:

[{"scopeId": 1, "scope": "SERVICE","name": "one-more-service", "id0": "b3JkZXItY2VudGVyLXNlYXJjaC1hcGk=.1",  "id1": "",  "ruleName": "service_resp_time_rule","alarmMessage": "服务【one-more-service】的平均响应时间在最近10分钟内有2分钟超过1秒","startTime": 1617670815000
}, {"scopeId": 2,"scope": "SERVICE_INSTANCE","name": "e4b31262acaa47ef92a22b6a2b8a7cb1@192.168.30.11 of one-more-service","id0": "dWF0LWxib2Mtc2VydmljZQ==.1_ZTRiMzEyNjJhY2FhNDdlZjkyYTIyYjZhMmI4YTdjYjFAMTcyLjI0LjMwLjEzOA==","id1": "","ruleName": "instance_jvm_young_gc_count_rule","alarmMessage": "实例【e4b31262acaa47ef92a22b6a2b8a7cb1@192.168.30.11 of one-more-service】的YoungGC次数在最近10分钟内有2分钟超过10次","startTime": 1617670815000
}, {"scopeId": 3,"scope": "ENDPOINT","name": "/one/more/endpoint in one-more-service","id0": "b25lcGllY2UtYXBp.1_L3RlYWNoZXIvc3R1ZGVudC92aXBsZXNzb25z","id1": "","ruleName": "endpoint_resp_time_rule","alarmMessage": "端点【/one/more/endpoint in one-more-service】的平均响应时间在最近10分钟内有2分钟超过1秒","startTime": 1617670815000
}]

gRPCHook

告警消息将使用 Protobuf 类型通过gRPC远程方法发送。消息格式的关键信息定义如下:

syntax = "proto3";option java_multiple_files = true;
option java_package = "org.apache.skywalking.oap.server.core.alarm.grpc";service AlarmService {rpc doAlarm (stream AlarmMessage) returns (Response) {}
}message AlarmMessage {int64 scopeId = 1;string scope = 2;string name = 3;string id0 = 4;string id1 = 5;string ruleName = 6;string alarmMessage = 7;int64 startTime = 8;
}message Response {
}

Slack Chat Hook

您需要遵循传入Webhooks入门指南并创建新的Webhooks。

如果您按以下方式配置了Slack Incoming Webhooks,则告警消息将按 Content-Typeapplication/json 通过HTTP的 POST 方式发送。

举个例子:

slackHooks:textTemplate: |-{"type": "section","text": {"type": "mrkdwn","text": ":alarm_clock: *Apache Skywalking Alarm* \n **%s**."}}webhooks:- https://hooks.slack.com/services/x/y/z

微信Hook

只有微信的企业版才支持 Webhooks ,如何使用微信的 Webhooks 可参见如何配置群机器人。

如果您按以下方式配置了微信的 Webhooks ,则告警消息将按 Content-Typeapplication/json 通过HTTP的 POST 方式发送。

举个例子:

wechatHooks:textTemplate: |-{"msgtype": "text","text": {"content": "Apache SkyWalking 告警: \n %s."}}webhooks:- https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=dummy_key

钉钉 Hook

您需要遵循自定义机器人开放并创建新的Webhooks。为了安全起见,您可以为Webhook网址配置可选的密钥。

如果您按以下方式配置了钉钉的 Webhooks ,则告警消息将按 Content-Typeapplication/json 通过HTTP的 POST 方式发送。

举个例子:

dingtalkHooks:textTemplate: |-{"msgtype": "text","text": {"content": "Apache SkyWalking 告警: \n %s."}}webhooks:- url: https://oapi.dingtalk.com/robot/send?access_token=dummy_tokensecret: dummysecret

问题

  • MySQL Failed to get driver instance for jdbcUrl

Activate MySQL as storage, and set storage provider to mysql.

NOTE: MySQL driver is NOT allowed in Apache official distribution and source codes. Please download the MySQL driver on your own. Copy the connection driver jar to oap-libs.

wget http://maven.aliyun.com/nexus/content/groups/public/maven2/mysql/mysql-connector-java/5.1.48/mysql-connector-java-5.1.48.jarwget http://maven.aliyun.com/nexus/content/groups/public/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar

总结

Skywalking部署简单,新版UI更加好用。skywalking在链路追踪、告警和性能指标统计等方面能帮助开发和运维快速定位问题,在半年多的使用中,发现过慢SQL语句、程序bug和报错等等。skywalking推送的告警更使各个项目的负责人对自己负责业务的性能指标做到心中有数,有问题及时优化。

参考

https://xie.infoq.cn/article/9ed9c65315251d0b39614d4d0

https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/7630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis中使用bloomfilter的白名单功能解决缓存预热问题

一 缓存预热 1.1 缓存预热 将需要的数据提前缓存到缓存redis中&#xff0c;可以在服务启动时候&#xff0c;或者在使用前一天完成数据的同步等操作。保证后续能够正常使用。 1.2 解决办法PostConstruct注解初始化

logback 自定义log字段(MDC)推送到logstash(spring boot + logback+ logstash)

直接上代码&#xff1a; 1.创建FIlter&#xff0c;往 MDC 里面追加内容 WebFilter Component public class LogBackFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepublic void doFilter(ServletRequest…

【复习16-18天】【我们一起60天准备考研算法面试(大全)-第二十四天 24/60】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

vue 全屏设置

全屏按钮调用&#xff08;全屏和退出全屏一个方法&#xff09; tofullscreenToggel(){this.isFullScreen!this.isFullScreenfullscreenToggel() } util方法定义 /*** 浏览器判断是否全屏*/ export const fullscreenToggel () > {if (fullscreenEnable()) {exitFullScree…

【MATLAB】GM(1,1) 灰色预测模型及算法

一、灰色预测模型概念 灰色预测是一种对含有不确定因素的系统进行预测的方法。 灰色预测通过鉴别系统因素之间发展趋势的相异程度&#xff0c;即进行关联分析&#xff0c;并对原始数据进行生成处理来寻找系统变动的规律&#xff0c;生成有较强规律性的数据序列&#xff0c;然后…

Python TypeError: unsupported operand type(s) for +: ‘int‘ and ‘str‘

在键入数值进行相加运算时&#xff0c;报了这样一个错误 类型错误&#xff1a;不支持操作类型为整数和字符串 错误分析&#xff1a;sumsuminput() 未被系统识别&#xff0c;导致程序错误 解决方法&#xff1a;给键入的数值定义&#xff0c;声明为整数 sumsumint(input()) 即…

centos服务器从阿里云同步时间

安装ntpdate yum -y install ntpdate同步一次时间 ntpdate ntp1.aliyun.com使用定时任务同步时间 编辑定时任务&#xff1a; crontab -e添加定时任务&#xff1a; */10 * * * * ntpdate ntp1.aliyun.com查看定时任务&#xff1a; crontab -l查看当前服务器时间 date -R

数据库系统安装、配置及管理与维护

一、安装与配置 数据库系统的安装步骤可能因不同版本和操作系统而有所差异&#xff0c;以下是一般的安装步骤&#xff1a; 下载数据库安装程序。从官方网站或其它可靠来源下载安装程序&#xff0c;确保下载的版本与您的操作系统版本和位数相匹配。运行安装程序。解压缩下载的…

c++--多态

1.多态概念 多态是C面面向对象的三大特性之一&#xff0c;多态需要在继承状态下完成&#xff0c;多态的特性就是面对相同的事情&#xff0c;需要不同的处理&#xff0c;产生不同的结果。 2.多态的条件及实现 多态是在不同的继承关系里&#xff0c;去实现函数名相同的不同实现…

【论文阅读】DEPIMPACT:反向传播系统依赖对攻击调查的影响(USENIX-2022)

Fang P, Gao P, Liu C, et al. Back-Propagating System Dependency Impact for Attack Investigation[C]//31st USENIX Security Symposium (USENIX Security 22). 2022: 2461-2478. 攻击调查、关键边、入口点 开源&#xff1a;GitHub - usenixsub/DepImpact 目录 1. 摘要2. 引…

前端学习——ajax (Day3)

AJAX原理 - XMLHttpRequest 使用 XMLHttpRequest <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&…

消息队列(一)-- RabbitMQ入门(1)

初识 RabbitMQ 核心思想&#xff1a;接收并转发消息。可以把它想象成一个邮局。 producer&#xff1a;生产者 queue&#xff1a;队列 consumer&#xff1a;消费者什么是消息队列 MQ&#xff08;Message Queue&#xff09;&#xff1a;本质是队列&#xff0c;FIFO先入先出&…

【【直流电机驱动PWN】】

直流电机驱动PWN 前面都是沙县小吃&#xff0c;这里才是满汉全席 直流电机是一种电能转化成机械能的装置 直流电机有两个电极 当电机正接 电机正转 当电机负接 电机倒转 电机还有步进电机 舵机 无刷电机 空心杯电机 因为电机是一个大功率器件并不太好直接接在IO端口上所以我…

设备模块调用整合指南

描述 不依赖其它事件管理器,直接引入js,全局事件方法(设备对象名+事件名)处理 #1、引入相关js <script src="./utils/lodash.min.js"></script><script src="config/config.js"></script><script src="./plugins/pl…

脑电信号处理与特征提取——1. 脑电、诱发电位和事件相关电位(胡理)

目录 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 1.2 经典的ERPs成分及研究 1.2.1 ERPs命名规则及分类 1.2.2 常见的脑电成分 1.2.3 P300及Oddball范式 1.2.4 N400成分 一、 脑电、诱发电位和事件相关电位 1.1 EEG基本知识 EEG(Electroencephalogram)&#x…

【Mysql数据库面试01】内连接 左连接 右连接 全连接

【Mysql数据库】内连接 左连接 右连接 全连接 0.准备1.内连接1.1 SQL(不带where)1.2 SQL&#xff08;带where&#xff09;1.3总结 2.左连接2.1SQL&#xff08;不带where&#xff09;2.2SQL&#xff08;带where&#xff09;2.3总结 3.右连接3.1 SQL&#xff08;不带where&#x…

CVPR2023新作:基于面部对称性先验的三维生成对抗网络反演方法

Title: 3D GAN Inversion With Facial Symmetry Prior (带面部对称性先验的3D GAN反演) Affiliation: 清华大学 Authors: Fei Yin, Yong Zhang, Xuan Wang, Tengfei Wang, Xiaoyu Li, Yuan Gong, Yanbo Fan, Xiaodong Cun, Ying Shan, Cengiz Oztireli, Yujiu Yang Keywords…

GDAL C++ API 学习之路 (6) OGRGeometry 几何类 OGRGeometry

Simplify virtual OGRGeometry *Simplify(double dTolerance) const 简化几何图形 参数: dTolerance -- 简化的距离容差。 返回: 简化的几何图形或 NULL&#xff08;如果发生错误&#xff09; // 创建一个多边形对象OGRLinearRing ring;ring.addPoint(0, 0);ring.addPoint…

CNN复习

个人的对于CNN总结的一些知识点 对于每一个卷积层来说&#xff0c;其out_channel就是卷积核的个数&#xff1a; 对每个输入的图片&#xff08;就是每一个&#xff08;C,H,W&#xff09;的矩阵&#xff0c;一共有batch_size个&#xff09;&#xff0c;卷积核从第0到第in_channe…

表单验证:输入的字符串以回车分隔并验证是否有

公司项目开发时&#xff0c;有一个需求&#xff0c;需要对输入的字符串按回车分隔并验证是否有重复项&#xff0c;效果如下&#xff1a; 表单代码&#xff1a; <el-form-item label"IP地址条目&#xff1a;" prop"ipAddressEntry"><el-inputtype&…