【关注公众号“SRE运维部落”,文章下回复可随时交流】
SkyWalking简介
上期给大家介绍到韩国开源版APM监控pinpoint,今天给大家介绍下国产开源版APM告警软件,也是一款社区非常活跃的Apache开源软件。
SkyWalking分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
SkyWalking 是观察性分析平台和应用性能管理系统。
提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案.
主要功能
多种监控手段,语言探针和service mesh
多语言自动探针,Java,.NET Core和Node.JS
轻量高效,不需要大数据
模块化,UI、存储、集群管理多种机制可选
支持告警
优秀的可视化方案
部署安装
一. 常用安装方式
1.官网下载安装
http://skywalking.apache.org/downloads/wget https://www.apache.org/dyn/closer.cgi/skywalking/6.4.0/apache-skywalking-apm-6.4.0.tar.gztar -xzf apache-skywalking-apm-6.4.0.tar.gz
解压包既可使用,包内分服务端和客户端
服务端使用:
# /apache-skywalking-apm-incubating/bin ./startup.sh
客户端使用:
默认情况下skywalking会加载/apache-skywalking-apm-incubating/agent/config/agent.config文件,也可以手动指定
jvm参数配置:
java-javaagent:/apache-skywalking-apm-incubating/agent/skywalking-agent.jar -Dskywalking.agent.service_name=trace-api -Dskywalking.collector.backend_service=localhost:11800-jar xxxx.jar
二. 安装参考文档
1.http://skywalking.apache.org/zh/2.https://www.jianshu.com/p/8157866deb86
使用规范
一. 服务地址
1. http://10.7.xxx.xx:8080/ 无相关账号密码,后期可对应进行二次开发
二. 使用操作
仪表板:
可针对应用节点的服务,端点,实例进行细度监控图标展示
可针对数据库数据源的相关sql以及iqps等常用参数进行监控展示
拓扑图:
各种图表应用实例全局展示,各种高大上
链路追踪:
监控细度在接口级别
告警:
可进行服务,服务实例,端点级别的监控,支持webhook告警模式,邮件钉钉自由开发。
相关注意事项
1.修改数据库连接数据源
sw初期为提高性能降低资源使用,采用hbase文件数据库,造成重启oap后,旧数据丢失。可根据需求自行修改使用mysql5.5+或es7.0.0-版本。
修改方式:修改/skywalking-service-6.4.0/config/application.yml文件和/skywalking-service-6.4.0/config/datasource-settings.properties
2.无用接口请求过滤【最好用的特色功能】
无用接口值相关的存活检测端口,在链路追踪会影响使用体验,可在客户端中进行配置进行过滤
skywalking-agent/config/apm-trace-ignore-plugin.config
3.traceid添加
traceid加入项目日志可进行日志查询时链路追踪,方便定位故障。
对项目进行侵入添加:
4.pom添加
org.apache.skywalkingapm-toolkit-logback-1.x{project.release.version}
5.logback-spring.xml配置
%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n
6.webhook消息通知配置
sw可进行告警消息通知发送,通过webhook的方式将消息推送邮箱,企业微信,钉钉,短信。(自行开发)
修改方式:/skywalking-service-6.4.0/config/alarm-settings.xml可以配置告警规则,告警规则支持自定义。
告警配置由以下几部分组成:
service_resp_time_rule:告警规则名称 ***_rule (规则名称可以自定义但是必须以’_rule’结尾
indicator-name:指标数据名称:定义参见http://t.cn/EGhfbmd
op: 操作符:> , < , = 【当然你可以自己扩展开发其他的操作符】
threshold:目标值:指标数据的目标数据 如sample中的1000就是服务响应时间,配合上操作符就是大于1000ms的服务响应
period: 告警检查周期:多久检查一次当前的指标数据是否符合告警规则
counts: 达到告警阈值的次数
silence-period:忽略相同告警信息的周期
message:告警信息
webhooks:服务告警通知服务地址
针对sw的webhook进行编写的钉钉推送脚本,测试可用,仅供参考,如有需要可关注公众号【SRE运维部落】,文章下留言即可。
# -*- coding:utf-8 -*-#/usr/bin/python#write by WJCimport socket import urllib import urllib2 import requestsimport jsonimport timeserverPort = 6690bind_ip ="10.7.xxx.xx"url="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxx"headers = {"Content-Type":"application/json","charset":"utf-8"}server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.bind((bind_ip, serverPort))server.listen(5)print ("the server is ready to receive")def get_headers(line_list):headers = {}for line in line_list:new_line = line.decode("utf8")index = new_line.find(":")key = new_line[:index]value = new_line[index+1:].strip()headers[key] = valuereturn headerswhile True:client, addr = server.accept()print ("Accepted connection from: %s:%d") % (addr[0], addr[1])sentence = client.recv(1024000)line_list = sentence.split(b"\r\n")print(line_list)if len(line_list[9]) > 0:line_list_str = eval(line_list[9])for i in range(len(line_list_str)):if line_list_str[i]["scopeId"] == 3:msg_type ="接口告警"ms ="响应时间在过去10分钟内超过1000毫秒,并两次触发告警"elif line_list_str[i]["scopeId"] == 1:msg_type ="应用服务告警"ms ="请求成功率在过去10分钟内低于80%,并两次触发告警"elif line_list_str[i]["scopeId"] == 0:msg_type ="instance告警"ms ="响应时间在过去10分钟内超过1000毫秒,并三次触发告警"elif line_list_str[i]["scopeId"] == 2:msg_type ="instance告警"ms ="90%的服务请求响应时间在过去10分钟内超过1000毫秒,并三次触发告警"else:msg_type ="另类告警"id = line_list_str[i]["id0"]msg_data = line_list_str[i]["alarmMessage"]if msg_data.find("server-A") == -1 and msg_data.find("instance-A"):#告警需要屏蔽的内容date=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())msg = """告警时间:{date}告警类型:{msg_type}告警 ID:{id}告警内容:{msg_data}.告警内容详述:该应用{ms},请相关同事注意关注!!!""".format(date=date,msg_type=msg_type,id=id,msg_data=msg_data,ms=ms)print(msg_data)print(msg)data = {"msgtype":"text","at": {"atMobiles": [# "15230505700",# "18601324188"], "isAtAll": False,},"text": {"content": msg}} print(data)req=requests.post(url,data=json.dumps(data),headers=headers)client.close()
高效开发:IntelliJIDEA的这些Debug技巧你都知道吗
网友评论