构建基于Prometheus的“指标导出器”应用

引言

服务基于JAVA1.8、SpringBoot、MySQL、Prometheus设计

一、技术选型

  • JAVA1.8
  • Springboot 2.1.8.RELEASE
  • MySQL 8.0
  • Prometheus 2.45.0
Springboot监控系统相关依赖
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-core</artifactId>
            <version>1.11.1</version>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <version>1.11.1</version>
        </dependency>
        <!--自定义指标依赖-->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient</artifactId>
            <version>0.16.0</version>
        </dependency>
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_hotspot</artifactId>
            <version>0.16.0</version>
        </dependency>
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_servlet</artifactId>
            <version>0.16.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.prometheus/simpleclient_spring_boot -->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_spring_boot</artifactId>
            <version>0.16.0</version>
        </dependency>
        <!-- Exposition HTTPServer-->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_httpserver</artifactId>
            <version>0.16.0</version>
        </dependency>
springboot配置文件相关配置
management:
  metrics:
    # 下面选项建议打开,以监控 http 请求的 P99/P95 等,具体的时间分布可以根据实际情况设置
    distribution:
      sla:
        http:
          server:
            requests: 1ms,5ms,10ms,50ms,100ms,200ms,500ms,1s,5s
    tags:
      application: ${spring.application.name}
  endpoints:
    prometheus:
      enabled: true
    web:
      base-path: /monitor
      exposure:
        include: "prometheus"

base-path 地址的值与prometheus的prometheus.yml中的metrics_path相对应
详情参见:https://blog.csdn.net/qq_41307963/article/details/132149338

二、示例:创建由MySQL数据库提供数据的指标

此为示例:创建不同状态密钥总数趋势。根据配置,prometheus会周期性的调用拉取数据储存到其时序数据库。

/**
 * 密钥总数
 * 子指标 状态
 *
 * @author lin
 * @Date 2023/7/12 18:48
 */
@Slf4j
@Component
public class SecretKeySumGauge {

    @Resource
    UcspKeyMapper keyMapper;

    MeterRegistry registry = RegistryUnit.getRegistry();

    /**
     * 创建有状态的,密钥数指标
     */
    @PostConstruct
    public void createKeyStateGauge() {
        // 状态快照
        for (KeyStatus item : KeyStatus.values()) {
            Gauge gauge = creteGauge(item);
        }
    }

    /**
     * 创建快照
     *
     * @param item 对应状态
     */
    private Gauge creteGauge(KeyStatus item) {
        Integer val = 0;
        List<Tag> tagList = baseTag();
        String tagType = item.getDesc();
        tagList.add(Tag.of(SECRET_KEY_STATUS, tagType));
        // 子快照
        Gauge gauge = Gauge.builder(SECRET_KEY_GAUGE_NAME, val, value -> countKeyByStatus(item.getKeyStatus()))
                .tags(tagList)
                // 描述
                .description(SECRET_KEY_GAUGE_DESP)
                // 注册
                .register(RegistryUnit.getRegistry());
        log.debug("gauge指标:{} tag {}:{} 已创建", SECRET_KEY_GAUGE_NAME,
                SECRET_KEY_STATUS, tagType);
        return gauge;
    }

    /**
     * 对应状态的密钥数
     *
     * @param status 状态
     * @return 密钥数
     */
    private Integer countKeyByStatus(Integer status) {
        QueryWrapper<UcspKey> wrapper = new QueryWrapper<UcspKey>()
                .eq(ObjectUtils.isNotEmpty(status),"status",status);
        return keyMapper.selectCount(wrapper);
    }

}

从容器中获取注册器方式如下:

public class RegistryUnit {

    private RegistryUnit(){}

    /**
     * 获取注册器
     *
     * @return registry
     */
    public static MeterRegistry getRegistry() {
        return SpringUtil.getBean(MeterRegistry.class);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*crzep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值