Prometheus is een open-source monitoring- en waarschuwingssysteem, ontworpen om metrics te verzamelen en te verwerken van applicaties en infrastructuur. Prometheus werkt volgens het pull-model, wat betekent dat het periodiek HTTP-verzoeken verzendt om gegevens te verzamelen van geconfigureerde targets. De verzamelde gegevens worden lokaal opgeslagen in een aangepaste database en kunnen worden opgevraagd met de PromQL-taal. Prometheus is zeer efficiënt in het monitoren van gedistribueerde systemen en is geoptimaliseerd voor moderne technologieën zoals Docker en Kubernetes.
Normaal gesproken genereren applicaties niet automatisch metrics. Ontwikkelaars moeten instrumentatie in de broncode integreren om deze te creëren. Client Libraries vereenvoudigen dit proces. Met een paar regels code kun je metrics definiëren en metingen direct integreren in de broncode die je beheert. Dit wordt directe instrumentatie genoemd. Prometheus biedt Client Libraries voor populaire talen zoals Go, Python, Java/JVM, Ruby en Rust. Daarnaast zijn er bibliotheken van derden voor andere talen zoals C#/.Net, Node.js, Haskell en Erlang.
Je hebt niet altijd toegang tot de broncode van software om code toe te voegen, dus directe instrumentatie is niet altijd mogelijk. Een Exporter is een kleine software die samen met de applicatie wordt geïnstalleerd waarvan je gegevens wilt verzamelen. Het ontvangt verzoeken van Prometheus, verzamelt gegevens van de applicatie, converteert deze naar een Prometheus-compatibel formaat en retourneert de resultaten. Je kunt een exporter zien als een data-converter tussen de applicatie en Prometheus. In tegenstelling tot directe integratie met client libraries, gebruiken exporters custom collectors of ConstMetrics.
Nadat je Prometheus hebt geïntegreerd in applicaties en exporters hebt geconfigureerd, moet Prometheus weten waar deze applicaties en exporters zich bevinden om ze te kunnen monitoren. In een dynamische omgeving zoals de cloud kunnen services constant veranderen (worden aangemaakt of verwijderd), dus je kunt niet één keer een lijst met applicaties en exporters opgeven. Deze lijst zou snel verouderd zijn, daarom is Service Discovery nodig. Prometheus integreert met populaire Service Discovery-mechanismen zoals Kubernetes, EC2 en Consul, waardoor het automatisch de te monitoren applicaties kan vinden. Als je systeem deze services niet gebruikt, biedt Prometheus ook een algemene integratiemethode voor andere systemen.
Nadat Prometheus de lijst met te monitoren targets heeft gevonden via service discovery en relabeling, moet het gegevens van deze targets ophalen. Prometheus doet dit door HTTP-verzoeken te verzenden, scraping genoemd, om metrics te verzamelen. Tijdens het verzamelen van gegevens registreert Prometheus ook nuttige informatie zoals: is de scrape succesvol? Hoelang duurde de scrape? Scraping wordt geconfigureerd om regelmatig plaats te vinden, meestal elke 10 tot 60 seconden per target. Prometheus gebruikt het pull-model, waarbij het actief gegevens verzamelt van de monitoring targets (in tegenstelling tot het push-model).
Prometheus slaat gegevens direct op de eigen server op, met behulp van een aangepaste database. In plaats van te proberen een complex gedistribueerd opslagsysteem te bouwen, kiest Prometheus voor lokale opslag voor een eenvoudiger en betrouwbaarder systeem. De huidige Prometheus 2.0-versie kan miljoenen samples per seconde verzamelen, krachtig genoeg om duizenden machines te monitoren met slechts één Prometheus-server. Prometheus gebruikt een krachtig compressie-algoritme, met een compressieverhouding van 1,3 byte per daadwerkelijke sample. SSD’s worden aanbevolen voor snelheid, maar zijn niet verplicht. Prometheus slaat alleen gegevens op de lokale server op, dus je bent beperkt door de schijfruimte van die machine. Dit kan problematisch zijn voor langdurige gegevensopslag. Prometheus heeft geen oplossing voor clustered storage. Het heeft echter remote read en remote write API’s waarmee verbinding kan worden gemaakt met externe opslagsystemen. Hierdoor kun je gegevens opvragen van zowel lokale als externe gegevens zonder de query te wijzigen.