Springboot 网关 Prometheus 收集海量数据

Posted

技术标签:

【中文标题】Springboot 网关 Prometheus 收集海量数据【英文标题】:Springboot gateway Prometheus collecting huge data 【发布时间】:2021-08-18 21:21:52 【问题描述】:

我使用 springboot 作为微服务。

我的 k8s 集群中有大约 20 个微服务

我正在使用 promethues 收集数据以在 grafana 中显示。

在该应用程序中有一些使用 Path 变量的 url,如下所示

    /v1/contacts/id /v1/users/id

还有几个 url,如果我考虑所有微服务中的所有此类 URL,那么可能是使用路径变量的 60 到 70 个 URL

问题:

现在每当请求任何网址时,即喜欢

    /v1/contacts/10 /v1/contacts/111 /v1/contacts/51 /v1/users/91

等等……

然后 promethus 正在收集所有此类 url 的指标。一段时间后,它有巨大的指标,最后我的响应时间增加了从普罗米修斯收集数据。

所以基本上我想在我的 springboot 应用程序间隔一段时间后清除 prometheus 日志。

我不确定这是否可能。

有人可以帮我解决这个问题吗?

谢谢

【问题讨论】:

您是否考虑过从 Spring Boot 发送像 robustperception.io/deleting-time-series-from-prometheus 这样的 http post 请求?或者更好的解决方案是在普罗米修斯抓取时间过滤不需要的指标? @Felipe 这就像从 prometheus 服务器中删除 prometheus 数据一样,我的问题是 /actuator/promethes 端点进入 sprintboot 应用程序。 Prometheus 数据存储在 springboot 应用程序中,因此会影响性能。 【参考方案1】:

Prometheus 有几个用于配置本地存储的标志。

--storage.tsdb.path: Prometheus 写入数据库的地方。默认为data/--storage.tsdb.retention.time:何时删除旧数据。默认为 15 天。如果此标志设置为默认值以外的任何值,则覆盖 storage.tsdb.retention。--storage.tsdb.retention.size:[实验] 要保留的存储块的最大字节数。最旧的数据将首先被删除。默认为 0 或禁用。此标志是实验性的,可能会在未来的版本中更改。支持的单位:B、KB、MB、GB、TB、PB、EB。例如:“512MB”

普罗米修斯存储link

步骤:

    Spring Boot 应用暴露监控指标,添加 以下依赖项。 <artifactId>spring-boot-starter-actuator</artifactId><groupId>io.prometheus</groupId>artifactId>simpleclient_spring_boot</artifactId>

    Prometheus 收集 Spring Boot 指标数据。首先,获取 Prometheus 的 Docker 镜像:docker pull prom/prometheus

    然后,编写配置文件prometheus.yml:

    global:
      scrape_interval: 10s
      scrape_timeout: 10s
      evaluation_interval: 10m
    
    scrape_configs:
      - job_name: prometheus
        scrape_interval: 5s
        scrape_timeout: 5s
        metrics_path: /metrics
        scheme: http
    

    您可以为其添加更多值。示例here

    接下来,启动 Prometheus:

    docker run -d -p 9090:9090 \
    -u root \
    -v /opt/prometheus/tsdb:/etc/prometheus/tsdb \
    -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
    --privileged=true prom/prometheus \
    --storage.tsdb.path=/etc/prometheus/tsdb \
    --storage.tsdb.retention.time=7d \
    --storage.tsdb.retention.size = 300MB \
    --config.file=/etc/prometheus/prometheus.yml
    

另一种方式,你可以使用这个链接Monitoring Spring Boot projects with Prometheus 但请确保当您使用 Docker Compose 运行 Prometheus 服务器时,您必须使用大小或时间属性更新 commands 部分。

【讨论】:

我的问题不是从 prometheus 服务器中删除数据,但是问题是我的 sprintboot 正在收集 prometheus 数据并将其保存到 JVM 内存中,因此下次我点击了 prometheus endpont /actuator/prometheus 然后它需要很长时间。我已经在清除 prometheus 服务器的数据了。 Prometheus 通常在数据量很大时会消耗大量内存。一个错误:github.com/prometheus/prometheus/issues/1881。 Spring boot 不直接提供支持。您可以限制每次抓取的样本数量,也可以通过范围选择器修改查询。一些有用的链接,供记忆***.com/questions/56115912/…。用于调整内存 prometheus.io/docs/prometheus/1.8/storage/#memory-usage 。查询修改prometheus.io/docs/prometheus/latest/querying/basics/…

以上是关于Springboot 网关 Prometheus 收集海量数据的主要内容,如果未能解决你的问题,请参考以下文章

统一观测丨使用 Prometheus 监控 Nginx Ingress 网关最佳实践

监控利器Prometheus——Prometheus+Grafana监控SpringBoot项目业务指标监控

Springboot2集成Prometheus

监控利器Prometheus——Prometheus+Grafana监控SpringBoot项目业务指标监控

监控利器Prometheus——Prometheus+Grafana监控SpringBoot项目业务指标监控

监控利器Prometheus——Prometheus+Grafana监控SpringBoot项目业务指标监控