10分钟快速开始SkyWalking结合Springboot项目

10分钟快速开始SkyWalking结合Springboot项目

实习期间,公司让我去学习一下链路追踪如何集成到Springboot项目中。
为此有两个方案:
1.opentelementry+jaeger+prometheus
opentelementry 收集器收集线上的metrics和traces,然后发送给jaeger和prometheus去处理。jaeger确实好很多,在一个controller中用多线程调用另一个controller依然能显示一颗完整的调用过程。但是可视化做的不行,需要依赖于grafana。这就导致需要开很多服务,因此不太容易搭建。
2.SkyWalking+elasticsearch
skywalking集成了收集和分析的功能,所以只需要elasticsearch作为存储就行,简单,可视化好,适用于个人和中小公司使用。

依赖配置

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.0.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.2.0.RELEASE</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><dependency> <!-- 引入log4j2依赖 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><version>2.2.0.RELEASE</version></dependency><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-log4j-2.x</artifactId><version>9.1.0</version></dependency><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.1.0</version></dependency>

这边需要排除掉springboot自带的日志框架,很重要

Dockerfile文件编写

version: '3.3'
services:elasticsearch:image: elasticsearch:7.17.6container_name: elasticsearchrestart: alwaysports:- "9201:9200"environment:- "TAKE_FILE_OWNERSHIP=true" #volumes 挂载权限 如果不想要挂载es文件改配置可以删除- "discovery.type=single-node" #单机模式启动- "TZ=Asia/Shanghai" # 设置时区- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 设置jvm内存大小volumes:- ./elasticsearch/logs:/usr/share/elasticsearch/logs- ./elasticsearch/data:/usr/share/elasticsearch/data#- ./elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.ymlulimits:memlock:soft: -1hard: -1skywalking-oap-server:image: apache/skywalking-oap-server:8.9.1container_name: skywalking-oap-serverdepends_on:- elasticsearchlinks:- elasticsearchrestart: alwaysports:- "11800:11800"- "12800:12800"environment:SW_STORAGE: elasticsearch  # 指定ES版本SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200TZ: Asia/Shanghai#volumes:#- ./oap/conf/alarm-settings.yml:/skywalking/config/alarm-settings.ymlskywalking-ui:image: apache/skywalking-ui:8.9.1container_name: skywalking-uidepends_on:- skywalking-oap-serverlinks:- skywalking-oap-serverrestart: alwaysports:- "9090:8080"environment:SW_OAP_ADDRESS: http://skywalking-oap-server:12800TZ: Asia/Shanghai

dockerfile如何运行,自行查询即可
启动完成之后,打开http://127.0.0.1:9090,会出现Skywalking的UI界面。

配置日志文件

在/src/main/resources下创建log4j2.xml文件

<?xml version="1.0" encoding="UTF-8"?><Configuration status="INFO"><Appenders><!-- 控制台输出 --><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d [%traceId] %-5p %c{1}:%L - %m%n"/></Console><!-- skywalking grpc 日志收集 8.4.0版本开始支持 --><GRPCLogClientAppender name="grpc-log"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></GRPCLogClientAppender></Appenders><Loggers><Root level="INFO"><AppenderRef ref="Console"/><AppenderRef ref="grpc-log"/></Root></Loggers></Configuration>

接下来,只需要写一个简单的测试项目,我这边主要用了我老的influxdb项目。可以参考一下,就不能cv大法了。

controller文件

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import top.warmheart.dao.DeviceDao;
import top.warmheart.pojo.Device;
import top.warmheart.service.impl.DeviceServiceImpl;
import top.warmheart.util.BaseResponse;
import java.time.Instant;
import java.time.LocalDateTime;/*** @author 滚~韬* @date 2024/1/29 13:00*/
@RestController
@RequestMapping("/influx")
public class InfluxDBController {@Autowiredprivate DeviceServiceImpl deviceServiceImpl;@Autowiredprivate DeviceDao dao;@GetMapping("/queryByTime")public BaseResponse Query(LocalDateTime start,LocalDateTime end){return dao.QueryByTime(start,end);}@GetMapping("/queryById")public BaseResponse Query(String Id){return dao.QueryById(Id);}@PostMapping("/DeleteByTime")public BaseResponse Delete(LocalDateTime start,LocalDateTime end){return dao.DeleteByTime(start,end);}@PostMapping("/insertByBlocking")public BaseResponse InsertByBlocking(Device device){device.setTime(Instant.now());return deviceServiceImpl.InsertDataByBlocking(device);}@PostMapping("/insert")public BaseResponse Insert(Device device){device.setTime(Instant.now());return deviceServiceImpl.InsertData(device);}
}

Service层

import com.influxdb.annotations.Measurement;
import com.influxdb.client.domain.InfluxQLQuery;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.exceptions.InfluxException;
import com.influxdb.query.InfluxQLQueryResult;
import com.influxdb.spring.influx.InfluxDB2Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.warmheart.core.Op;
import top.warmheart.core.Query;
import top.warmheart.enums.ErrorCode;
import top.warmheart.model.DeleteModel;
import top.warmheart.model.QueryModel;
import top.warmheart.pojo.Device;
import top.warmheart.service.DeviceService;
import top.warmheart.util.BaseResponse;
import top.warmheart.util.InfluxdbUtils;import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.List;import static top.warmheart.decorator.InfluxApiDecorator.*;/*** @author 滚~韬* @date 2024/1/26 13:20*/@Service
public class DeviceServiceImpl implements DeviceService {@Autowiredprivate InfluxDB2Properties influxDB2Properties;protected static Logger log = LoggerFactory.getLogger(DeviceServiceImpl.class);public BaseResponse QueryData(Class<?> clazz, QueryModel queryModel) {Measurement annotation = clazz.getAnnotation(Measurement.class);if (annotation != null) {queryModel.setMeasurement(annotation.name()).setWhere(Op.where(queryModel));}String build = Query.build(queryModel);return QueryData(build);}public BaseResponse QueryData(String sql) {log.info("查询语句:" + sql);InfluxQLQueryResult result = getInfluxQLQueryApi().query(new InfluxQLQuery(sql, influxDB2Properties.getBucket()));return QueryData(result);}public BaseResponse QueryData(InfluxQLQueryResult result) {if (result == null) {return new BaseResponse(200, null, "获取成功,无数据");}List<Device> pojo = InfluxdbUtils.toPOJO(result, Device.class);log.info("查询数据数量为:" + pojo.size() + "--------------------------");return new BaseResponse(200, pojo, "获取成功");}public BaseResponse InsertData(Object o) {try {getWriteApi().writeMeasurement(WritePrecision.NS, o);} catch (Exception e) {return new BaseResponse(ErrorCode.SYSTEM_ERROR, "插入数据过程中异常");}return new BaseResponse(200, o, "插入成功");}public BaseResponse InsertDataByBlocking(Object o) {try {getWriteApiBlocking().writeMeasurement(WritePrecision.NS, o);} catch (Exception e) {return new BaseResponse(ErrorCode.SYSTEM_ERROR, "插入数据过程中异常");}return new BaseResponse(200, o, "插入成功");}/*** 批量写有问题** @param devices* @return*/@Deprecatedpublic BaseResponse InsertData(List<Device> devices) {try {getWriteApi().writeMeasurements(WritePrecision.NS, devices);} catch (Exception e) {return new BaseResponse(ErrorCode.SYSTEM_ERROR, "插入数据过程中异常");}return new BaseResponse(200, devices, "插入成功");}public BaseResponse DeleteData(DeleteModel deleteModel) {try {OffsetDateTime startOff = OffsetDateTime.of(deleteModel.getStart(), ZoneOffset.UTC);OffsetDateTime endOff = OffsetDateTime.of(deleteModel.getEnd(), ZoneOffset.UTC);getDeleteApi().delete(startOff, endOff, "", influxDB2Properties.getBucket(), influxDB2Properties.getOrg());} catch (InfluxException ie) {log.warn("InfluxException: " + ie);return new BaseResponse(ErrorCode.SYSTEM_ERROR, "删除错误");}return new BaseResponse(200, null, "删除成功");}}

dao层

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import top.warmheart.enums.ErrorCode;
import top.warmheart.model.DeleteModel;
import top.warmheart.model.QueryModel;
import top.warmheart.pojo.Device;
import top.warmheart.service.DeviceService;
import top.warmheart.util.BaseResponse;import java.time.LocalDateTime;
import java.util.Map;
import java.util.TreeMap;/*** @Author:滚韬* @Date:2024/1/30 14:28*/
@Component
public class DeviceDao {@Autowiredprivate DeviceService deviceService;/*** 根据给定时间范围查询数据** @param start 开始时间* @param end   结束时间,可选参数,如果不传,则默认为当前时间* @return 查询结果的BaseResponse对象*/public BaseResponse QueryByTime(LocalDateTime start,LocalDateTime end){QueryModel queryModel = new QueryModel();if (start!=null){queryModel.setStart(start);if(end!=null){queryModel.setEnd(end);}else{queryModel.setEnd(LocalDateTime.now());}}else {return new BaseResponse(ErrorCode.SYSTEM_ERROR,"开始日期不能为空(检查是否格式正确)");}return deviceService.QueryData(Device.class, queryModel);}public BaseResponse QueryById(String Id){Map<String, Object> map = new TreeMap<>();map.put("device_no", Id);QueryModel queryModel = new QueryModel();queryModel.setMap(map);return deviceService.QueryData(Device.class, queryModel);}public BaseResponse DeleteByTime(LocalDateTime start,LocalDateTime end){DeleteModel deleteModel = new DeleteModel();if (start!=null){deleteModel.setStart(start);if(end!=null){deleteModel.setEnd(end);}else{deleteModel.setEnd(LocalDateTime.now());}}else {return new BaseResponse(ErrorCode.SYSTEM_ERROR,"开始日期不能为空(检查是否格式正确)");}return deviceService.DeleteData(deleteModel);}
}

启动

在虚拟机参数里加上这段,注意skywalking-agent.jar要去官网下载,jar包外面的文件也不能丢失,否则会报错
-javaagent:C:/skywalking/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=你自己的服务名字
-Dskywalking.collector.backend_service=127.0.0.1:11800

效果

请求查询接口,记得日志要打在service层里面
在这里插入图片描述
在这里插入图片描述

dashboard介绍

在这里插入图片描述
CPM/PPM:服务负荷
slow Services: 慢服务
Un-Health Services (Apdex): Apdex性能指标(1是满分)
Slow Endpoints: 慢请求点
Global Response Latency:百分比响应延时,不同百分比的延时时间,单位ms

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

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

相关文章

清新文艺的微社区PaoPao

什么是 PaoPao &#xff1f; PaoPao 是一个 Go 写的轻量级社区。采用 GinVue 实现的微社区&#xff0c;界面清爽拥有话题、发布短内容、评论等功能。 安装 在群晖上以 Docker 方式安装。 本文写作时&#xff0c;bitbus/paopao-ce 镜像&#xff0c; latest 对应的版本是 0.5.2 …

数字化转型导师坚鹏:地市级政府数字化转型案例研究

地市级政府数字化转型案例研究 课程背景&#xff1a; 很多地市级政府存在以下问题&#xff1a; 不清楚地市级政府数字化转型的政务服务类成功案例 不清楚地市级政府数字化转型的社会管理类成功案例 不清楚地市级政府数字化转型的智慧城市类成功案例 课程特色&#xff…

【蓝桥杯】拓扑排序

一.拓扑排序 1.定义&#xff1a; 设G&#xff08;V&#xff0c;E&#xff09;是一个具有n个顶点的有向图&#xff0c;V中的顶点序列称为一个拓扑序列&#xff0c;当且仅当满足下列条件&#xff1a;若从顶点到有一条路径&#xff0c;则在顶点序列中顶点必在之前。 2.基本思想…

海南云仓酒庄拜会三亚市贸促会与三亚国际商会共谋发展 共绘蓝图

2024年2月23日上午&#xff0c;三亚市贸促会党组书记、会长、三亚国际商会会长方玉来在三亚国际商会会议室与海南云仓酒庄有限公司党支部书记蒋义一行进行了深入座谈交流&#xff0c;本次还有副会长张成山、秘书处副秘书长孙秋丽、李婧参加了座谈会。此次座谈会旨在加强双方的合…

JAVA毕业设计129—基于Java+Springboot+thymeleaf的物业管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootthymeleaf的物业管理系统(源代码数据库)129 一、系统介绍 本项目前后端分离&#xff0c;本系统分为管理员、小区管理员、用户三种角色 1、用户&#xff1a; 登…

yolov8车辆识别模型(附数据集)

目录 前言 一、我的数据集 二、其他车辆数据集 三、我的模型 四、模型训练&#xff08;一站式链接&#xff09; 五、我的训练过程 前言 因为为了做毕设&#xff0c;所以训练了一个道路监控的车辆模型。 效果不是很好&#xff0c;希望大佬们指导一下。 再此也分享我找了到的…

《Docker 简易速速上手小册》第6章 Docker 网络与安全(2024 最新版)

文章目录 6.1 Docker 网络概念6.1.1 重点基础知识6.1.2 重点案例&#xff1a;基于 Flask 的微服务6.1.3 拓展案例 1&#xff1a;容器间的直接通信6.1.4 拓展案例 2&#xff1a;跨主机容器通信 6.2 配置与管理网络6.2.1 重点基础知识6.2.2 重点案例&#xff1a;配置 Flask 应用的…

Python高性能web框架--Fastapi快速入门

文章目录 fastapi框架一、预备知识点1.1、http协议一、简介二、 http协议特性三、http请求协议与响应协议 1.2、api接口 二、quick start简单案例 fastapi框架 Fastapi&#xff0c;一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的web框架。 fastapi的两个核心…

three中界面交互gui.js库的使用

gui.js库(可视化改变三维场景) dat.gui.js说白了就是一个前端js库&#xff0c;对HTML、CSS和JavaScript进行了封装&#xff0c;学习开发的时候&#xff0c;借助dat.gui.js可以快速创建控制三维场景的UI交互界面&#xff0c;你打开课件中案例源码体验一下就能感受到。 学习dat…

Flask基础学习4

19-【实战】问答平台项目结构搭建_剪_哔哩哔哩_bilibili 参考如上大佬的视频教程&#xff0c;本博客仅当学习笔记&#xff0c;侵权请联系删除 问答发布的web前端页面实现 register.html {% extends base.html %}{% block head %}<link rel"stylesheet" href&q…

【Antv-G6成长之路一】初识antv G6之什么是G6,G6能做哪些事情?(附实例图文)

G6详解目录 写在前面涉及知识&#xff1a;效果图1、G6是什么&#xff1f;1.1、g6的概念1.2、g6的应用 2、G6基础示例demo2.1、引入组件包&#xff08;js&#xff09;2.2、创建画布div2.3、创建G6节点2.4 常用节点属性说明2.5、设置数据节点和连线2.6、代码最终实现 3、G6官网4、…

嵌入式学习day25 Linux

进程基本概念: 1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&a…