【问题标题】:Prometheus gauge with custom collector - go带有定制收集器的 Prometheus 仪表 - go
【发布时间】:2019-09-18 13:26:06
【问题描述】:

我在“重置”仪表值时遇到问题,因为一旦 http servervice 启动或当我开始循环我的“runJob”时“生命停止”,那么服务器没有启动..

我试图建立这个的方式:

我从 YAML 数组中加载所有 Job-s。 我从中生成仪表,然后我运行循环以获取它们的一些值。 然后我注册他们。

然后我为 prometheus 启动 http 服务。

一切都很完美,直到下一个周期 - 下一个周期还没有开始。

我尝试在函数等内部移动函数。

这就是我的主要功能:

        //gets poll time from yaml (60s)
    timerCh := time.Tick(time.Duration(appConf.PollTimeSec) * time.Second)

    //loop after given time
    for range timerCh {
        runJobs()

    }

    //start new muxServer
    server := http.NewServeMux()
    log.Println("DEBUG: Starting server")
    server.Handle(appConf.HostPath, promhttp.Handler())

    http.ListenAndServe(":"+appConf.ListenerPort, server)

而我的 runJobs 函数基本上是获取 Http 响应代码 并将它们广告到普罗米修斯计量值。 - 一切都很好,它在启动时效果很好,但是在我尝试启动它之后(如 main go 所示)它只是卡住了 -

服务器已启动且值未更改。

所以我有(我的选择)两种可能的修复方法:

  1. 我的“runJobs”是每分钟运行一次的不定式循环

    • 这就是服务器没有启动的原因。
    • 但是当我添加一个 if 语句时,在第一次运行(循环)时应该启动服务器,然后当服务器启动时它仍然会卡住(下一个循环循环不会启动)
  2. 另一部分,当我首先启动服务器时,它永远不会到达它启动 runJobs() 的部分

首选的结果应该是:

服务器以第一个值启动,每分钟后它再次运行“runJobs”。

【问题讨论】:

    标签: loops go prometheus


    【解决方案1】:

    按照它的编写方式,您的程序不会超出 for 循环。试试这个:

    go func() {
     //loop after given time
        for range timerCh {
            runJobs()
    
        }
    }()
    

    这会在自己的 goroutine 中运行 for 循环,并且 runJobs 会每隔一段时间执行一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      相关资源
      最近更新 更多