© 2025 Rocky. All rights reserved.

|浙ICP备2025179428号-3|友情链接|

魔法施展中...

技术文章

技术分享

Rails集成prometheus的几个经验

2024-02-21
5 分钟
...
rails

安装prometheus和设置指标

单纯地将prometheus集成进rails,整体上比较方便:

安装rometheus-client

  1. 在Gemfile中添加prometheus-client:
bundle add prometheus-client

引入prometheus 中间件

  1. 在config/application.rb中引入:
require 'prometheus/middleware/exporter'
config.middleware.use Prometheus::Middleware::Exporter

创建指标

新建文件 config/initializers/promethues.rb文件,在这里创建一些需要的指标。

require 'prometheus/client'
$prometheus = Prometheus::Client.registry
$metrics = {}
$metrics[:msgs_handled] = $prometheus.counter(:msgs_handled, docstring: 'A counter of messages handled')

在必要时,更新指标

比如,在某个controller方法中:

class SomeController << ApplicationController

def handle
    #...
       $metrics[:msgs_handled].increment
    #...
end 

检查指标是否输出

访问localhost:3000/metrics ,看是否输出了所有指标。

解决认证问题

默认情况下,用中间件方式引入prometheus,是开放访问的,我们可以给他加一个basic auth认证。

提示:请记得修改成自己的密码。

创建认证中间件

#lib/middleware/promethues_middleware.rb
# frozen_string_literal: true

# lib/middleware/prometheus_middleware.rb
require 'rack/auth/basic'

class PrometheusMiddleware
  USERS = {"some-username" => "some-password"}
  def initialize(app)
    @app = app
  end

  def call(env)
    auth = Rack::Auth::Basic::Request.new(env)

    uri = env['REQUEST_URI'] || env['PATH_INFO']


    if auth.provided? && auth.basic? && auth.credentials && USERS[auth.credentials.first] == auth.credentials.last
      @app.call(env)
    else
      if uri == "/metrics"
        unauthorized_response
      else
        @app.call(env)
      end
    end
  end

  def unauthorized_response
    [401, {"Content-Type" => "text/plain","WWW-Authenticate"=>"Basic realm='metrics'"}, ["Unauthorized\n"]]
  end
end

引入中间件

在config/application.rb中做一下修改:

  class Application < Rails::Application
    #.... some more


    require 'prometheus/middleware/exporter'
    require   "#{Rails.root}/lib/middleware/prometheus_middleware"
    
    config.middleware.use Prometheus::Middleware::Exporter
    config.middleware.insert_before 0,PrometheusMiddleware

  end

其他经验

通过rails c 进入控制台时,或者在crono任务中,是另外开启了新的进程,是无法更新到rails进程中的$metrics变量的,切记。 如果要用到定时任务,可以用rufus这个定时器。

感谢阅读!如果您觉得这篇文章有帮助,欢迎分享给更多的朋友。

上一篇
技术实践

使用开源模型GPT_SoVITS训练自己的tts

[GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS) 是github上开一个开源的tts模型,可以基于用户上传的声音(哪怕只是一分钟的声音)得到用户声音模型,然后根据文字来生成语音。

下一篇
技术实践

在PHP中集成prometheus

在PHP中添加自定义的Prometheus指标通常涉及到几个步骤,这些步骤包括使用或搭建一个Prometheus客户端,定义指标,更新这些指标,以及将这些指标暴露给Prometheus服务器。下面是如何在PHP项目中进行此操作的一般指导。

📮 订阅更新
每周收到最新文章推送,不错过精彩内容

💡 我们尊重您的隐私,不会将邮箱用于其他用途

加载中...

猜你喜欢

职业发展

我的人生准则

- 不随便给建议:好为人师是一件让人讨厌的事。

2022-01-09
人生感悟
技术分享

Apache drill 查询的执行

当您提交Drill查询的时候,客户端或应用程序会把查询以SQL语句的形式发送到Drill集群的一个Drillbit。Drillbit是在每个在线的Drill节点上运行的进程,它负责协调,规划和执行查询,并按照最大限度地实现数据本地化的原则在集群中分发查询。

2017-04-14
职业发展

经历过至暗时刻,才有成长

有的人很幸运,从小就家教严格,学会了自律,所有的一切都优秀的那么完美。而普通人中的大多数,都会经过一些特定的事件才会成熟,那个特定的事件,也许是父母亲的去世,也许是一次离婚,也许是一次裁员,也许是一次破产,总之让你足够痛苦,不敢面对。

2021-04-16