永久网站空间,标书制作员工资很低吗,ftp服务器搭建设置网站信息,上海快速排名优化10分钟快速开始SkyWalking结合Springboot项目
实习期间#xff0c;公司让我去学习一下链路追踪如何集成到Springboot项目中。 为此有两个方案#xff1a; 1.opentelementryjaegerprometheus opentelementry 收集器收集线上的metrics和traces#xff0c;然后发送给jaeger和p…10分钟快速开始SkyWalking结合Springboot项目
实习期间公司让我去学习一下链路追踪如何集成到Springboot项目中。 为此有两个方案 1.opentelementryjaegerprometheus opentelementry 收集器收集线上的metrics和traces然后发送给jaeger和prometheus去处理。jaeger确实好很多在一个controller中用多线程调用另一个controller依然能显示一颗完整的调用过程。但是可视化做的不行需要依赖于grafana。这就导致需要开很多服务因此不太容易搭建。 2.SkyWalkingelasticsearch skywalking集成了收集和分析的功能所以只需要elasticsearch作为存储就行简单可视化好适用于个人和中小公司使用。
依赖配置 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdversion2.2.0.RELEASE/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.2.0.RELEASE/versionexclusionsexclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-logging/artifactId/exclusion/exclusions/dependencydependency !-- 引入log4j2依赖 --groupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-log4j2/artifactIdversion2.2.0.RELEASE/version/dependencydependencygroupIdorg.apache.skywalking/groupIdartifactIdapm-toolkit-log4j-2.x/artifactIdversion9.1.0/version/dependencydependencygroupIdorg.apache.skywalking/groupIdartifactIdapm-toolkit-trace/artifactIdversion9.1.0/version/dependency这边需要排除掉springboot自带的日志框架很重要
Dockerfile文件编写
version: 3.3
services:elasticsearch:image: elasticsearch:7.17.6container_name: elasticsearchrestart: alwaysports:- 9201:9200environment:- TAKE_FILE_OWNERSHIPtrue #volumes 挂载权限 如果不想要挂载es文件改配置可以删除- discovery.typesingle-node #单机模式启动- TZAsia/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:12800environment: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:8080environment:SW_OAP_ADDRESS: http://skywalking-oap-server:12800TZ: Asia/Shanghaidockerfile如何运行自行查询即可 启动完成之后打开http://127.0.0.1:9090,会出现Skywalking的UI界面。
配置日志文件
在/src/main/resources下创建log4j2.xml文件
?xml version1.0 encodingUTF-8?Configuration statusINFOAppenders!-- 控制台输出 --Console nameConsole targetSYSTEM_OUTPatternLayout pattern%d [%traceId] %-5p %c{1}:%L - %m%n//Console!-- skywalking grpc 日志收集 8.4.0版本开始支持 --GRPCLogClientAppender namegrpc-logPatternLayout pattern%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n//GRPCLogClientAppender/AppendersLoggersRoot levelINFOAppenderRef refConsole/AppenderRef refgrpc-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, 获取成功,无数据);}ListDevice 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(ListDevice 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滚韬* Date2024/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){MapString, 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_service127.0.0.1:11800
效果
请求查询接口记得日志要打在service层里面
dashboard介绍 CPM/PPM:服务负荷 slow Services: 慢服务 Un-Health Services (Apdex): Apdex性能指标(1是满分) Slow Endpoints: 慢请求点 Global Response Latency:百分比响应延时不同百分比的延时时间单位ms