0

我在“重置”仪表的值时遇到问题,因为一旦启动 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 响应代码并将它们广告到 prometheus 仪表值。- 一切都很好,它在启动时效果很好,但是在我尝试启动它之后(如 main go 所示)它只是卡住了 -

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

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

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

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

首选的结果应该是:

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

4

1 回答 1

0

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

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

    }
}()

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

于 2019-09-18T13:36:23.060 回答