Prometheus内部实现(四)
目标该怎么管理?静态还是动态发现? 目标管理是使用静态还是动态发现,这个和基础架构有关,要回答这个问题,需要先说说应用部署的现状! 目前,企业应用部署有两种选项: 基于虚拟机 基于容器 当然,更多的是虚拟机里装docker,算是两者的结合,节省成本。 那么基于虚拟机部署应用有什么特点呢?就是变化小,你的预期和实际情况是相对静止的,在虚拟机上部署一套应用,一套流程走下来,大概得小半天吧,这种情况把要监控的目标写到Prometheus的配置文件,再重启Prometheus server,完全玩得转! 然而,当公司的应用开始基于容器部署,特别是管控平面使用了k8s,那么手动配置Prometheus、重启就成为了噩梦一样的存在!运维会疲于奔命,开发会吐槽运维。 所以监控目标的配置,取决于使用的底层技术! 题外话:要想Devops在企业落地,得有一整套配套的工具,整体打通。 那么Prometheus在抓取目标方面是怎么做的呢?我们先重温一下相关组件的启动: { // Scrape discovery manager. g.Add( func() error { err := discoveryManagerScrape.Run() level.Info(logger).Log("msg", "Scrape discovery manager stopped") return err }, func(err error) { level.Info(logger).Log("msg", "Stopping scrape discovery manager...") cancelScrape() }, ) } { // Notify discovery manager. ... } { // Scrape manager. g.Add( func() error { // When the scrape manager receives a new targets list // it needs to read a valid config for each job. // It depends on the config being in sync with the discovery manager so // we wait until the config is fully loaded. <-reloadReady.C err := scrapeManager.Run(discoveryManagerScrape.SyncCh()) level.Info(logger).Log("msg", "Scrape manager stopped") return err }, func(err error) { // Scrape manager needs to be stopped before closing the local TSDB // so that it doesn't try to write samples to a closed storage. level.Info(logger).Log("msg", "Stopping scrape manager...") scrapeManager.Stop() }, ) } 启动的核心语句: ...