adding node exporter, loki, and promtail
This commit is contained in:
		
							
								
								
									
										100
									
								
								addon-prometheus/rootfs/opt/prometheus-configgen/combiner
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								addon-prometheus/rootfs/opt/prometheus-configgen/combiner
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
			
		||||
import sys
 | 
			
		||||
import asyncio
 | 
			
		||||
import aionotify
 | 
			
		||||
import yaml
 | 
			
		||||
import os
 | 
			
		||||
import tempfile
 | 
			
		||||
import requests
 | 
			
		||||
 | 
			
		||||
from yaml_include import Constructor
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def generateConfig():
 | 
			
		||||
    Constructor.add_to_loader_class(
 | 
			
		||||
        loader_class=yaml.FullLoader, base_dir="/share/prometheus/"
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    with open("prometheus.template") as f:
 | 
			
		||||
        data = yaml.load(f, Loader=yaml.FullLoader)
 | 
			
		||||
 | 
			
		||||
    data["scrape_configs"] = (
 | 
			
		||||
        data[".scrape_configs_static"] + data[".scrape_configs_included"]
 | 
			
		||||
    )
 | 
			
		||||
    del data[".scrape_configs_static"]
 | 
			
		||||
    del data[".scrape_configs_included"]
 | 
			
		||||
    return yaml.dump(data, default_flow_style=False, default_style="")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def testConfig(config):
 | 
			
		||||
    tmp = None
 | 
			
		||||
    result = False
 | 
			
		||||
    try:
 | 
			
		||||
        tmp = tempfile.NamedTemporaryFile()
 | 
			
		||||
        with open(tmp.name, "w") as f:
 | 
			
		||||
            f.write(config)
 | 
			
		||||
        r = os.system("promtool check config " + tmp.name + "> /dev/null")
 | 
			
		||||
        result = r == 0
 | 
			
		||||
    except:
 | 
			
		||||
        print("Failed to validate")
 | 
			
		||||
        raise
 | 
			
		||||
    if not result:
 | 
			
		||||
        raise Exception("validation error")
 | 
			
		||||
    return result
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def writeConfig(config, file):
 | 
			
		||||
    try:
 | 
			
		||||
        with open(file, "w") as f:
 | 
			
		||||
            f.write(config)
 | 
			
		||||
        r = requests.post(url="http://localhost:9090/-/reload", data={})
 | 
			
		||||
    except:
 | 
			
		||||
        print("Exception")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
loop = asyncio.get_event_loop()
 | 
			
		||||
paths_to_watch = ["/share/prometheus/targets/"]
 | 
			
		||||
 | 
			
		||||
lock = asyncio.Lock()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def compile():
 | 
			
		||||
    if lock.locked() == False:
 | 
			
		||||
        await lock.acquire()
 | 
			
		||||
        try:
 | 
			
		||||
            config = generateConfig()
 | 
			
		||||
            testConfig(config)
 | 
			
		||||
            writeConfig(config, "/etc/prometheus/prometheus.yml")
 | 
			
		||||
            print("Compiled")
 | 
			
		||||
        except:
 | 
			
		||||
            pass
 | 
			
		||||
        finally:
 | 
			
		||||
            lock.release()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def watcher():
 | 
			
		||||
    asyncio.create_task(compile())
 | 
			
		||||
    filewatch = aionotify.Watcher()
 | 
			
		||||
    for path in paths_to_watch:
 | 
			
		||||
        filewatch.watch(
 | 
			
		||||
            path,
 | 
			
		||||
            aionotify.Flags.MODIFY | aionotify.Flags.CREATE | aionotify.Flags.DELETE,
 | 
			
		||||
        )
 | 
			
		||||
        print(path)
 | 
			
		||||
    await filewatch.setup(loop)
 | 
			
		||||
    while True:
 | 
			
		||||
        event = await filewatch.get_event()
 | 
			
		||||
        sys.stdout.write("Got event: %s\n" % repr(event))
 | 
			
		||||
        asyncio.create_task(compile())
 | 
			
		||||
    filewatch.close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    try:
 | 
			
		||||
        loop.run_until_complete(watcher())
 | 
			
		||||
    finally:
 | 
			
		||||
        # loop.close()
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    main()
 | 
			
		||||
@@ -0,0 +1,38 @@
 | 
			
		||||
---
 | 
			
		||||
# my global config
 | 
			
		||||
global:
 | 
			
		||||
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
 | 
			
		||||
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
 | 
			
		||||
  # scrape_timeout is set to the global default (10s).
 | 
			
		||||
 | 
			
		||||
# Alertmanager configuration
 | 
			
		||||
alerting:
 | 
			
		||||
  alertmanagers:
 | 
			
		||||
    - static_configs:
 | 
			
		||||
        - targets:
 | 
			
		||||
            # - alertmanager:9093
 | 
			
		||||
 | 
			
		||||
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
 | 
			
		||||
rule_files:
 | 
			
		||||
  - "/share/prometheus/rules/*.yaml"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.scrape_configs_included: !include targets/*.yaml
 | 
			
		||||
.scrape_configs_static:
 | 
			
		||||
  - job_name: 'home-assistant'
 | 
			
		||||
    scrape_interval: 60s
 | 
			
		||||
    metrics_path: /core/api/prometheus
 | 
			
		||||
 | 
			
		||||
    # Long-Lived Access Token
 | 
			
		||||
    bearer_token_file: '/run/home-assistant.token'
 | 
			
		||||
 | 
			
		||||
    scheme: http
 | 
			
		||||
    static_configs:
 | 
			
		||||
    - targets: ['supervisor:80']
 | 
			
		||||
  - job_name: 'prometheus'
 | 
			
		||||
 | 
			
		||||
    # metrics_path defaults to '/metrics'
 | 
			
		||||
    # scheme defaults to 'http'.
 | 
			
		||||
 | 
			
		||||
    static_configs:
 | 
			
		||||
    - targets: ['localhost:9090']
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
aionotify
 | 
			
		||||
pyyaml-include>=1.2
 | 
			
		||||
PyYAML>=5.3.1
 | 
			
		||||
requests>=2.23.0
 | 
			
		||||
yaml_include
 | 
			
		||||
		Reference in New Issue
	
	Block a user