Spring Boot整合Sentry

news2024/9/21 4:40:46

Spring Boot整合Sentry

  • Sentry搭建
  • Sentry中新建项目
  • 集成SpringBoot
      • 1. 添加依赖
      • 2. 配置Sentry
      • 4. 日志集成(可选)
      • 5. 测试Sentry集成
      • 6. 配置实时告警
        • 配置Alert Settings
        • 配置警报规则
      • 发送消息服务代码
      • 参照文档

Sentry 是一个日志平台,分为客户端和服务端,客户端(目前客户端有Python, PHP,C#, Ruby等多种语言)就嵌入在你的应用程序中间,程序出现异常就向服务端发送消息,服务端将消息记录到数据库中并提供一个web节目方便查看。

Sentry搭建

使用Docker方式运行,步骤:
git clone https://github.com/getsentry/self-hosted.git
cd self-hosted
sudo ./install.sh
docker compose up -d

Sentry中新建项目

登录Sentry,创建项目,项目类型选择java。
在这里插入图片描述
在项目的配置里可以,获取项目DSN,之后需要使用到。
在这里插入图片描述

集成SpringBoot

1. 添加依赖

pom.xml文件中添加Sentry的Spring Boot Starter依赖:

<dependency>
    <groupId>io.sentry</groupId>
    <artifactId>sentry-spring-boot-starter</artifactId>
    <version>7.14.0</version>
</dependency>

2. 配置Sentry

application.yml文件中添加Sentry的配置。你需要替换your-dsn为你的实际DSN(Data Source Name),可以从Sentry的项目设置中获取。

sentry:
  dsn: http://81c1d156c742567a99e115b8fa9b6395@192.168.1.77:9000/4

4. 日志集成(可选)

如果你想要将日志事件也发送到Sentry,你可以配置Spring Boot的日志框架。
添加依赖

<dependency>
    <groupId>io.sentry</groupId>
    <artifactId>sentry-logback</artifactId>
    <version>7.14.0</version> 
</dependency>

logback.xml中添加Sentry Appender:

<configuration>
  <appender name="SENTRY" class="ch.qos.logback.classic.sentry.SentryAppender">
    <minimumEventLevel>warn</minimumEventLevel>
    <minimumBreadcrumbLevel>info</minimumBreadcrumbLevel>
  </appender>

  <root level="INFO">
    <appender-ref ref="SENTRY" />
  </root>
</configuration>
  • minimumEventLevel用来指定warn级别会产生一次「Event」
  • minimumBreadcrumbLevel用来配置面包屑级别。

使用官方文档的日志级别配置,不起作用:

  • sentry.logging.minimum-event-level=info
  • sentry.logging.minimum-breadcrumb-level=debug

5. 测试Sentry集成

你可以通过手动触发一个异常来测试Sentry是否正确配置:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @GetMapping("/test-error")
    public void test() {
    log.info("info, test throw exception");
    log.error("error, test throw exception");
    throw new IllegalArgumentException("hello world");
  }
}

在sentry查看异常是否被正确捕获:
在这里插入图片描述

6. 配置实时告警

国内使用钉钉,企业微信告警,Sentry不支持。但是支持WebHooks对接,可以自己写一个服务接受WebHooks的消息,然后转发到钉钉,或者企业微信。

配置Alert Settings

在项目的Alert Settings里配置 WEBHOOKS:
在这里插入图片描述

配置警报规则

在项目的Alert Settings,点击"View Alert Rules",编辑你的警报规则,把通知发给”WebHooks"
在这里插入图片描述

发送消息服务代码

在钉钉群里配置webhooks机器人,活动weebhooks 链接。
写一个springboot服务接受Sentry通过WebHooks发来的消息,然后转发给钉钉。

  1. SentryEvent Sentry消息
package com.alert.domain;

import com.fasterxml.jackson.annotation.JsonProperty;

public class SentryEvent {

  private String message;
  private String url;
  private String project;
  private String group;
  private String id;
  private String eventID;
  private String level;
  private String timestamp;
  private String logger;
  private String culprit;
  private String platform;
  private String modules;
  private String user;
  private String tags;
  private String fingerprint;
  private String logEntry;
  private String stacktrace;
  private String extra;
  private String context;
  private String threads;
  private String request;
  private String exceptions;
  private String debugMeta;

  @JsonProperty("message")
  public String getMessage() {
    return message;
  }

  public void setMessage(String message) {
    this.message = message;
  }

  public String getUrl() {
    return url;
  }

  public void setUrl(String url) {
    this.url = url;
  }

  public String getLevel() {
    return level;
  }

  public void setLevel(String level) {
    this.level = level;
  }

  public String getTimestamp() {
    return timestamp;
  }

  public void setTimestamp(String timestamp) {
    this.timestamp = timestamp;
  }

  // 其他getter和setter方法
}
  1. restful服务
package com.alert.controller;

import com.wits.alert.domain.SentryEvent;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/alert" )
public class SentryWebhookController {

  // 设置钉钉机器人的Webhook URL
  String dingTalkUrl = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxx";


  @PostMapping(value = "/sentry", consumes = MediaType.APPLICATION_JSON_VALUE)
  public void handleSentryCrm(@RequestBody SentryEvent event, String name) {
    // 处理事件
    sendToDingTalk(event, name);
  }

  private void sendToDingTalk(SentryEvent event, String appName) {
    // 构建消息
    Map<String, Object> message = new HashMap<>();
    message.put("msgtype", "text");
    Map<String, String> textContent = new HashMap<>();
    textContent.put("content", appName + "告警: [" + event.getLevel() + "]" + event.getMessage() + "\n" + event.getUrl());
    message.put("text", textContent);

    // 发送请求
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<Map<String, Object>> request = new HttpEntity<>(message, headers);

    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<String> response = restTemplate.postForEntity(dingTalkUrl, request, String.class);

    // 检查响应
    if (response.getStatusCodeValue() == 200) {
      System.out.println("Message sent successfully to DingTalk.");
    } else {
      System.err.println("Failed to send message to DingTalk: " + response.getBody());
    }
  }
}

参照文档

https://docs.sentry.io//

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

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

相关文章

WEB服务器的部署及优化

什么是 www&#xff1f; www 是 world wide web 的缩写&#xff0c;及万维网&#xff0c;也就是全球信息广播的意思 通常说的上网就是使用 www 来查询用户所需要的信息。 www 可以结合文字、图形、影像以及声音等多媒体&#xff0c;超链接的方式将信息以 Internet 传递到世界…

记录一下QGIS栅格操作-植被NDVI指数计算

记录一下QGIS栅格操作-植被NDVI指数计算 以计算植被NDVI指数为例&#xff0c;介绍QGIS栅格的相关操作以及应用。 NDVI 数据简介及下载 下载&#xff1a; 地理空间数据云https://www.gscloud.cn/search 选择波段4&#xff08;可见光红色波段&#xff09;和波段5&#xff08;近…

VS2022 - 制作自己的C#类库dll,并输出Unity识别的pdb调试信息文件

然后编写库代码&#xff0c;设置dll生成目录 *** 输出unity可以识别的pdb调试信息文件 *** 右键项目-属性-生成-高级-调试信息&#xff1a;可移植(Portable PDB) 这是因为Unity只能识别MDB和Portable PDB文件 这样设置后&#xff0c;把dll和pdb文件放入到Unity中同文件夹下&…

金融帝国实验室(Capitalism Lab)官方技术支持中文汉化包_v4.09

<FCT汉化小组>Vol.001号作品 ————————————— ◎ 作品名称&#xff1a;金融帝国实验室&#xff08;Capitalism Lab&#xff09;官方中文汉化包 ◎ 制作发布&#xff1a;FCT汉化小组 ◎ 发布版本&#xff1a;CapLab Simplified Chinese loc v4.09 ◎ 发布时…

django学习入门系列之第十点《初识 django》

文章目录 django初识django1 安装django2 创建django项目3 默认项目文件介绍4 APP 往期回顾 django Python知识点:函数、面向对象。前端开发: HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库Python的Web框架Flask&#xff0c;自身短小精悍第三方组件。Django&#xf…

Linux驱动开发基础(SR501人体红外模块)

所学来自百问网 目录 1.模块简介 2.原理图及接线 3.设备树修改 4.驱动程序 5.应用程序 6.makefile 7.编译运行 1.模块简介 人体都有恒定的体温&#xff0c;一般在37度&#xff0c;所以会发出特定波长10uM左右的红外线&#xff0c;被动式红外探头就是靠探测人体发射的1…

Kafka·概述

概览 Producer 生产者发送消息给broker&#xff0c;并不是生成一条消息后立刻发送&#xff0c;而是积攒多条后&#xff0c;批量发送到broker。可以通过配置参数batch.size&#xff08;单位字节&#xff09;调整积攒多少后发送 Consumer Topic 消息的分类 当Producer发送指定…

沾包问题,wireshark和netstat的使用

一.沾包 TCP是一个面向字节流的传输层协议。“流” 意味着 TCP 所传输的数据是没有边界的。这不同于 UDP 协议提供的是面向消息的传输服务&#xff0c;其传输的数据是有边界的。TCP 的发送方无法保证对方每次收到的都是一个完整的数据包。于是就有了粘包、拆包问题的出现。粘包…

[数据集][目标检测]电力场景输电线杆塔塔架金属锈蚀腐蚀生锈检测数据集VOC+YOLO格式1344张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1344 标注数量(xml文件个数)&#xff1a;1344 标注数量(txt文件个数)&#xff1a;1344 标注…

医学领域使用Python语言的逻辑和代码的规范

在医学领域使用Python进行数据分析和建模时&#xff0c;掌握良好的编程逻辑和代码规范非常重要。这不仅可以提高代码的质量&#xff0c;还能让其他研究人员更容易理解和复现你的工作。下面是一些关于如何编写高质量Python代码的建议&#xff1a; 代码组织 模块化&#xff1a;…

软件设计师教程(第5版)第5章 软件工程基础知识(更新中)

5.1 软件工程概述 【软件工程】是指应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题的工程&#xff0c;其目的是提高软件生产率、提高软件质量、降低软件成本。P239 5.1.1 计算机软件 计算机软件是指计算机系统中的【程序】及其【文档】。P240 【…

android13 隐藏状态栏里面的背光调节 隐藏下拉栏背光调节

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.修改方法 4.编译运行 5.彩蛋 1.前言 隐藏下拉栏里面的背光调节,禁止用户在这里调节背光亮度。 2.问题分析 我们找到对应的布局,然后在里面隐藏掉。 使用之前文章介绍的布局查找工具,查找亮度条id id/bri…

驱动开发系列11 - Linux Graphics 图形栈概述(二)

目录 一:GPU 和 硬件 现代 GPU 功能概览: 硬件结构: 屏幕驱动: 屏幕连接器: 屏幕 CRT 控制器: CPU与GPU通信: 现代主机通信总线介绍: 通信方法: GPU 编程:通过 MMIO 访问寄存器 CPU 和 GPU 内存请求路由: GPU 可访问的内存区域: GTT/GART 是 CPU 与 GPU 共享的通信缓…

谷粒商城实战笔记-254-商城业务-消息队列-Direct-Exchange

文章目录 一&#xff0c;252-商城业务-消息队列-Direct-Exchange1&#xff0c;创建4个队列2&#xff0c;exchange绑定queue3&#xff0c;发送消息 二&#xff0c;253-商城业务-消息队列-Fanout-Exchange1&#xff0c;创建一个type为fanout的exchange2&#xff0c;给这个exchang…

开源的即时聊天解决方案Papercups

Papercups&#xff1a;让聊天支持变得简单、私密、实时。 - 精选真开源&#xff0c;释放新价值。 概览 Papercups是一款开源的实时客户支持工具&#xff0c;它使用Elixir语言构建&#xff0c;为注重客户数据隐私和安全性的公司提供了一个自托管的解决方案。这款工具的设计理念…

【C语言】常见文件操作

文件的常见操作 #include<stdio.h>// 由于devc代码编码为ANCI&#xff0c;故读取的文件中若有中文&#xff0c;请设置文件编码为ANCI&#xff0c;否则会乱码 // 读文件 void test1() {char ch;FILE *fp; // 创建文件指针fp fopen("./file.txt", "r"…

秋招突击——8/21——知识补充——计算机网络——cookie、session和token

文章目录 引言正文Cookie——客户端存储和管理Session——服务端存储和管理Token补充签名和加密的区别常见的加密算法和签名算法 面试题1、HTTP用户后续的操作&#xff0c;服务端如何知道属于同一个用户&#xff1f;如果服务端是一个集群机器怎么办&#xff1f;2、如果禁用了Co…

BaseCTF [第 1 周] ez_maze

笔记。 64ida打开。 更加确定。 所以常规做这类型题 思路(简单的话)&#xff1a; 先提取字符 计算其长度 对半分。 BaseCTF{131b7d6e60e8a34cb01801ae8de07efe}

基于YOLOv8的无人机高空红外(HIT-UAV)检测算法,魔改SimAM注意力助力涨点(一)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文内容&#xff1a;针对基于YOLOv8的无人机高空红外&#xff08;HIT-UAV&#xff09;检测算法进行性能提升&#xff0c;加入各个创新点做验证性试验。 1&#xff09;魔改SimAM注意力&#xff0c;引入切片操作&#xff1a;mAP从原始的…

算法日记day 46(单调栈之下一个更大元素|柱状图中最大图形)

一、下一个更大元素1 题目&#xff1a; nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。 对于每个 0 …