1、 Skywalking概述

        Skywalking是一个可观测性分析平台和应用性能管理系统,它也是基于OpenTracing规范、开源的 AMP 系统。 Skywalking 提供分布式跟踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

        SkyWalking 特点:

        1)多语言自动探针

        2)为多种开源项目提供了插件

        3)微内核 + 插件的架构 ,存储、集群管理、使用插件集合都可以进行自由 选择

        4)支持告警

优秀的可视化效果

        Skywalking数据存储方式常用的有5种,分别为 H2(默认)、Elasticsearch、MySql、TiDB、InfluxDB等,Skywalking默认6秒实时刷新,查询性能要求高,所以下面使用的是Skywalking+Elasticsearch的实现方式。

2、Skywalking安装

Skywalking 架构图:

opengauss数据库监控 skywalking 数据库监控_opengauss数据库监控

SkyWalking分为:客户端,服务端

客户端: agent 组件

        agent 运行在各个服务实例中,负责采集服务实例的 Tracing 、Metrics 等数据,然后通过 gRPC 或HTTP方式上报给 SkyWalking 的数据收集器。

服务端:又分为 OAP , Storage , WebUI

        OAP: observability analysis platform 可观测性分析平台,负责接收客户端上报的数据,对数据进行分析,聚合,计算后将数据进行存储,并且还会提供一些查询API 进行数据的查询,这个模块其实就是我们所说的链路追踪系统的Collector 收集器。

        Storage: skyWalking 的存储介质,默认是采用 H2 ,同时支持许多其他的存储介质,比如:ElastaticSearch , mysql 等。

        WebUI:提供一些图形化界面展示对应的跟踪数据,指标数据等等。

Skywalking的oap-server 、 Skywalking-UI。为方便部署,可以使用Compose服务编排。

2.1、Compose服务编排

         Docker Compose是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

2.1.1、Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序

2.1.2、Compose安装

# Compose目前已经完全支持Linux、Mac OS和Windows,在安装Compose之前,需要先安装Docker。先以编译好的二进制包方式安装在Linux系统中。

# 更新一下yum

yum update

# 安装yum相关的依赖

yum install -y yum-utils device-mapper-persistent-data lvm2

# 配置yum 告诉yum在哪下载docker

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装docker-ce 社区版(免费)

yum install -y docker-ce

# -v version 查看版本,验证安装成功

docker -v

# 启动docker服务

systemctl start docker

# 为方便使用,可以设置开机自启动docker服务

systemctl enable docker

1)运行以下命令以下载 Docker Compose 的当前稳定版本:

# curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2)将可执行权限应用于二进制文件:

# chmod +x /usr/local/bin/docker-compose

3)创建软链:

# ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

4)测试是否安装成功:

# docker-compose --version 或者 docker-compose -v

2.2 服务端部署

创建 docker - compose.yml 并配置如下 :

version: '3.3'
services:
  elasticsearch:
    image: elasticsearch:7.6.2
    container_name: elasticsearch
    restart: always
    privileged: true
    hostname: elasticsearch  
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - TZ=Asia/Shanghai
    networks:
      - skywalking
    ulimits:
      memlock:
        soft: -1
        hard: -1
  oap:
    image: apache/skywalking-oap-server:8.3.0-es7
    container_name: oap
    hostname: oap
    privileged: true
    depends_on:
      - elasticsearch
    links:
      - elasticsearch
    restart: always
    ports:
      - 11800:11800
      - 12800:12800
    environment:
      SW_STORAGE: elasticsearch7
      SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200
      TZ: Asia/Shanghai
    volumes:
      - ./config/alarm-settings.yml:/skywalking/config/alarm-settings.yml
    networks:
      - skywalking
  ui:
    image: apache/skywalking-ui:8.3.0
    container_name: ui
    privileged: true
    depends_on:
      - oap
    links:
      - oap
    restart: always
    ports:
      - 8080:8080
    environment:
      SW_OAP_ADDRESS: oap:12800
      TZ: Asia/Shanghai
    networks:
      - skywalking

networks:
  skywalking:
    driver: bridge

通过命令一键启动:docker-compose up -d

        启动成功后即可访问skywalking 的 webui的8080端口的 页面

3、Skywalking应用

3.1、agent安装

Skywalking 源码下载地址: https://archive.apache.org/dist/skywalking/

        项目使用agent, 需要将下载的 apache - skywalking - apm - bin 文件包上传到服务器。 并将 agent/config/agent.config 配置文 件拷贝到每个需要集成Skywalking 工程的 resource目录下,并修改应用名配置, 修改其 中的 agent.service_name,如下:

agent.service_name = ${SW_AGENT_NAME : taxi-gateway}

还有其他方式覆盖服务名::

1)JVM 覆盖配置

# "skywalking." 是 Skywalking 环境变量的默认前缀

-Dskywalking.agent.service_name = taxi-driver

2) 探针配置覆盖

# 默认格式是 -javaagent:agent.jar=[option1]=[value1], [option2]=[value2]

-javaagent : /path/skywalking-agent.jar = agent.service_name = taxi-driver

优先级: 探针配置 > JVM 配置 > 系统环境变量配置 > agent.config 文件默认值

3.2、IDEA集成使用agent

1 、修改 agent 中数据收集服务的地址: agent/config/agent.confg

collector.backend_service = ${SW_AGENT_COLLECTOR_BACKEND_SERVICES : {linux服务器IP地址} : 11800}

2 、使用探针配置为涉及 项目分别配置 agent :

-javaagent : D : \develop\skywalking\apache-skywalking-apm-bin\agent\skywalking-agent.jar

-Dskywalking.agent.service_name = taxi-driver

3.3 生产环境使用agent

        生产环境使用,因此我们需要将agent 和每个项目的 jar 包上传到服务器上,上传 apache- skywalking - apm - bin 至 /usr/local/server/skywalking ,再将工程taxi - parent 中的项目打包,并分别上传到服务器上启动 taxi-driver 等项目。

java -javaagent :/usr/local/server/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar -Dskywalking .agent .service_name = taxi-driver -jar taxi-driver-1.0-SNAPSHOT.jar &

然后在SkyWalking 提供的 UI 界面—— Skywalking Rocketbot仪表盘查看启动状态

opengauss数据库监控 skywalking 数据库监控_intellij-idea_02

告警

        SkyWalking 告警是 6.x 版本新增的功能,其核心由一组规则驱动,这些规则定义在 config/alarm - settings.yml 文件中。 告警的定义分为两部分:

1) 告警规则:定义了应该如何触发度量警报、触发条件。

2) Webhook (网络钩子) :定义当警告触发时,哪些服务终端需要被告知。

        Skywalking每隔一段时间根据收集到的链路追踪的数据和配置的告警规则(如服务响应时间、服务响应时间百分比)等,判断如果达到阈值则发送相应的告警信息。发送告警信息是通过调用webhook接口完成。

        SkyWalking 的发行版都会默认提供 config/alarm - settings.yml 文件,里面预先定义了一些常用的告警规则,定义告警要通知的服务地址。

webhooks: 
         - http://{linux服务器IP地址}:18081/skywalking/webhook

Webhook 配置其实是警告消息接收回调处理,可以在程序中写一个方法接收警告信息,Skywalking 会以 application/json 格式通过 http 请求发送,消息格式声明为:

List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage 。字段如下:

  • scopeId、scope:所有可用的 Scope 详见
  • name:目标 Scope 的实体名称
  • id0:Scope 实体的 ID
  • id1:保留字段,目前暂未使用
  • ruleName:告警规则名称
  • alarmMessage:告警消息内容
  • startTime:告警时间,格式为时间戳

@Data@ToStringpublic class AlarmMessage {
    private int scopeId;
    private String name;
    private String id0;
    private String id1;
    private String alarmMessage;
    private long startTime;
    String ruleName;
}
        
@RestController@RequestMapping(value = "/skywalking")public class AlarmMessageController {
    @PostMapping("/webhook")
    public void webhook(@RequestBody List<AlarmMessage> alarmMessageList) {
        //邮件或短信通知开发支持人员
    }
}

邮箱工具类

/** * 发送邮件工具类 */

@Component
public class SendMailUtil {

    private String host = "smtp.mxhichina.com";

    private String username = "albb@mxhi.com";

    private String password = "lc-87654321";

    public boolean sendMail(String recipient, String title, String content) {
        try {
            Properties props = new Properties();
            //设置发邮件的协议
            props.setProperty("mail.transport.protocol", "smtp");
            //设置发邮件的地址(smtp邮箱服务器地址)
            props.setProperty("mail.smtp.host", host);
            // 指定验证为true
            props.setProperty("mail.smtp.auth", "true");

            props.setProperty("mail.smtp.port", smtpPort);
            // 发件人的账号
            props.put("mail.user", username);
            //发件人的密码
            props.put("mail.password", password);

            // 构建授权信息
            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    // 用户名、密码
                    String username = props.getProperty("mail.user");
                    String password = props.getProperty("mail.password");
                    return new PasswordAuthentication(username, password);
                }
            };
            // 创建邮件会话
            Session mailSession = Session.getInstance(props, authenticator);
            // 创建邮件消息
            MimeMessage message = new MimeMessage(mailSession);
            // 发件人
            String username = props.getProperty("mail.user");
            InternetAddress from = new InternetAddress(username);
            message.setFrom(from);
            // 收件人
            InternetAddress toAddress = new InternetAddress(recipient);
            message.setRecipient(Message.RecipientType.TO, toAddress);
            // 邮件标题
            message.setSubject(title);
            // 邮件的内容体
            message.setContent(content, "text/html;charset=UTF-8");
            // 发送邮件
            Transport.send(message);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}

        这些就是SkyWalking安装及应用所涉及的文件及代码,有需要可以参考!!!