在springboot 中集成prometheus的监控时遇见问题。

因为项目里在StaticResourceConfig配置了fastjson 序列化,导致prometheus接口返回数据被转化为json格式,无法正常展示

正常情况格式应为这种



实际返回了这种



StaticResourceConfig 配置如下:

    @Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof MappingJackson2HttpMessageConverter) {
converters.remove(converter);
}
}
converters.add(new ByteArrayHttpMessageConverter());
converters.add(getFastJsonConverter());
} private FastJsonHttpMessageConverter getFastJsonConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
//提供对admin的类型支持mediaType
MediaType mediaType = MediaType.valueOf("application/vnd.spring-boot.actuator.v2+json");
supportedMediaTypes.add(mediaType);
supportedMediaTypes.add(MediaType.ALL);
converter.setSupportedMediaTypes(supportedMediaTypes);
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteDateUseDateFormat,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteMapNullValue,
SerializerFeature.DisableCircularReferenceDetect);
//日期格式化
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
ParserConfig parserConfig = ParserConfig.getGlobalInstance();
parserConfig.setSafeMode(true);
fastJsonConfig.setParserConfig(parserConfig);
converter.setFastJsonConfig(fastJsonConfig); return converter;
}

解决办法

通过增加一层转发,调用监控接口获取到数据,然后反序列化为原来的格式,然后通过response.write方式返回监控结果。

因为采用response.write的方式,不会被spring mvc的HttpMessageConverter所拦截,所以可以直接返回plain/text格式的数据

package com.yuanian.monitor;

import com.alibaba.fastjson.JSON;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.URISyntaxException; /**
* @author liujy
* @since Wed Feb 24 17:55:16 CST 2021
*/
@RestController
@RequestMapping("prometheus")
public class PrometheusController {
@Value("${server.servlet.context-path}")
private String contextPath;
@Value("${server.port}")
private Integer port; @GetMapping(path = "/metrics", produces = MediaType.TEXT_PLAIN_VALUE)
public void healthz(HttpServletResponse response) throws URISyntaxException {
RestTemplate restTemplate = new RestTemplate();
StringBuilder prometheusUrl = new StringBuilder("http://127.0.0.1:");
prometheusUrl.append(port);
prometheusUrl.append(contextPath);
prometheusUrl.append("/actuator/prometheus"); ResponseEntity<String> responseEntity = restTemplate.getForEntity(prometheusUrl.toString(), String.class);
String body = responseEntity.getBody();
String s = JSON.parseObject(body, String.class); try (BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream())) {
bos.write(s.getBytes());
} catch (IOException e) {
e.printStackTrace();
} }
}

fastjson序列化导致prometheus返回监控数据格式错乱的更多相关文章

  1. FastJson序列化Json自定义返回字段,普通类从spring容器中获取bean

    前言: 数据库的字段比如:price:1 ,返回需要price:1元. 这时两种途径修改: ① 比如sql中修改或者是在实体类转json前遍历修改. ②返回json,序列化时候修改.用到的是fastj ...

  2. 实战 Prometheus 搭建监控系统

    实战 Prometheus 搭建监控系统 Prometheus 是一款基于时序数据库的开源监控告警系统,说起 Prometheus 则不得不提 SoundCloud,这是一个在线音乐分享的平台,类似于 ...

  3. Grafana+Prometheus系统监控之webhook

    概述 Webhook是一个API概念,并且变得越来越流行.我们能用事件描述的事物越多,webhook的作用范围也就越大.Webhook作为一个轻量的事件处理应用,正变得越来越有用. 准确的说webho ...

  4. 用自定义注解实现fastjson序列化的扩展

    这篇文章起源于项目中一个特殊的需求.由于目前的开发方式是前后端分离的,基本上是通过接口提供各个服务. 而前两天前端fe在开发中遇到了一些问题:他们在处理字符串类型的时间时会出现精度丢失的情况,所以希望 ...

  5. cAdvisor+Prometheus+Grafana监控docker

    cAdvisor+Prometheus+Grafana监控docker 一.cAdvisor(需要监控的主机都要安装) 官方地址:https://github.com/google/cadvisor ...

  6. fastjson序列化出现StackOverflowError

    今天在一个web项目里开发功能,记录日志用到了fastjson的序列化,把类型为RetreatRecord的数据对象序列化后打印出来.结果出现StackOverflowError.先贴出来异常堆栈: ...

  7. prometheus自定义监控指标——入门

    grafana结合prometheus提供了大量的模板,虽然这些模板几乎监控到了常见的监控指标,但是有些特殊的指标还是没能提供(也可能是我没找到指标名称).受zabbix的影响,自然而然想到了自定义监 ...

  8. kubernetes(k8s) Prometheus+grafana监控告警安装部署

    主机数据收集 主机数据的采集是集群监控的基础:外部模块收集各个主机采集到的数据分析就能对整个集群完成监控和告警等功能.一般主机数据采集和对外提供数据使用cAdvisor 和node-exporter等 ...

  9. FastJson序列化时过滤字段(属性)的方法总结

    FastJson序列化时(即转成JSON字符串时),可以过滤掉部分字段,或者只保留部分字段,方法有很多,下面举一些常用的方法. 方法一.FastJson的注解 @JSONField(serialize ...

  10. Prometheus+Grafana监控

    什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控系统 ...

随机推荐

  1. 使用python对Excel表格某个区域保存为图片

    实际工作中,我们经常会把表格某个区域(如:A1:F5)或某个图形保存为图片,如何用python自动做到这一点?不知屏幕前的小伙伴有没有遇到过类似的需求,此刻脑海里有木有一丢丢思路. python操作e ...

  2. 人形机器人(humanoid)的摔倒实验/撞击实验

    motivation: 人形机器人的实体比较昂贵,但是实验过程中机器人的摔倒和撞击时十分常见的事情,这就会导致机器人的元器件被损坏,造成较大的经济损失,为此我们在设计机器人的机械结构和电子元器件布局时 ...

  3. 《Python数据可视化之matplotlib实践》 源码 第二篇 精进 第七章

    图   7.1   import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np mpl.rcParams[& ...

  4. 基于浅层神经网络(全连接网络)的强化学习算法(Reinforce) 在训练过程中出现梯度衰退(degenerate)的现象

    首先给出一个代码地址: https://gitee.com/devilmaycry812839668/CartPole-PolicyNetwork 强化学习中的策略网络算法.<TensorFlo ...

  5. gym.ObservationWrapper使用时的注意点——reset和step函数可以覆盖observation函数

    记录一个刚学习到的gym使用的点,就是gym.ObservationWrapper使用时的注意点--reset和step函数可以覆盖observation函数. 给出代码: import gym cl ...

  6. SeaTunnel毕业!首个国人主导的数据集成项目成为Apache顶级项目

    采访嘉宾 | 郭炜.高俊 编辑 | Tina 北京时间 2023 年 6 月 1 日,全球最大的开源软件基金会 Apache Software Foundation(以下简称 ASF)正式宣布 Apa ...

  7. js map方法处理返回数据,获取指定数据简写方法

    map方法处理返回数据,获取指定数据简写方法 前言 后端返回数据为数组列表时,通常比较全面,包含了很多不需要的数据,可以通过 map 方法处理返回数据,筛选出想要的数据 例如 // 返回数据 res ...

  8. 记一次 .NET某环境监测系统 崩溃分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序崩溃了,也自己分析了下初步结果,让我帮忙再确认下,既然让我确认,那就开始dump分析之旅吧. 二:WinDbg 分析 1. 为什么会崩溃 wi ...

  9. 38k Star!颠覆传统BI,Metabase新一代智能数据分析工具

    Metabase 是一个开源的商业智能(BI)工具,帮助用户轻松地从数据库中提取数据,并将其转化为易于理解的图表和仪表板.与传统的 BI 工具相比,Metabase 不需要用户具备编写 SQL 的能力 ...

  10. OSI 七层网络模型和 TCP/IP 四层网络模型

    OSI 七层网络模型 网络的七层架构从下到上主要分为:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层 物理层主要定义物理设备标准,它的主要作用是传输比特流,具体做法是在发送端将 1.0 码 ...