Minutely probes zijn een mechanisme om periodiek aangepaste metrics naar AppSignal te sturen. Dit is een systeem dat standaard is opgenomen in het AppSignal Elixir-pakket. Aan het begin van elke minuut worden de minutely probes geactiveerd om metrics te verzamelen en vervolgens tot de volgende minuut gepauzeerd.
Standaard schakelt het AppSignal Elixir-pakket een probe in voor de ErlangVM.
Opmerking: We raden aan om AppSignal Elixir-pakket 1.10.1 en hoger te
gebruiken bij het gebruik van deze functie.
Gebruik
De minutely probes stellen het AppSignal Elixir-pakket in staat om standaard aangepaste metrics te verzamelen voor de ErlangVM en app-specifieke metrics door uw eigen probe te creëren.
Meerdere instances
Eenmaal geactiveerd, draait het minutely-probesysteem op elke instance van een app. Dit betekent dat als een probe metrics rapporteert zonder een onderscheidende tag, globale metrics overschreven kunnen worden door metrics op instance-niveau.
Om dit te verhelpen, raden we aan uw metrics te taggen met de hostname of iets anders dat uniek is voor elke instance. Bijvoorbeeld, de ErlangVM Probe tagt metrics standaard met de hostname.
Alternatief kunt u minutely probes uitschakelen voor alle instances behalve één, waarop het minutely-probeproces draait. We raden aan om de omgevingsvariabele APPSIGNAL_ENABLE_MINUTELY_PROBES te gebruiken om deze alleen in te schakelen op de instance van uw keuze.
Configuratie
De minutely probes worden geconfigureerd met de configuratieoptie enable_minutely_probes. De standaardwaarde is true.
Probes creëren
Als u meer aangepaste metrics van uw app wilt traceren dan onze standaard probes doen, kunt u uw eigen probe(s) toevoegen.
Een AppSignal minutely probe kan een Anonieme functie of een Op een module gebaseerde functie zijn.
Anonieme functie
Het eenvoudigste probetype om te registreren. Als u geen afhankelijkheden voor uw probe heeft, is dit de voorkeursmethode.
Appsignal.Probes.register(:my_probe, fn ->
Appsignal.set_gauge("database_size", 10)
end)
Op een module gebaseerde functie
Een op een module gebaseerde functie kan nuttig zijn als u een complexere probe heeft, of een probe die afhankelijkheden heeft.
# lib/my_app/probes/my_probe.ex
defmodule MyApp.MyProbe do
def call do
Appsignal.set_gauge("database_size", 10)
end
end
Nu kunt u deze probe registreren in de startfunctie van uw OTP-app.
Appsignal.Probes.register(:my_probe, &MyApp.MyProbe.call/0)
Stateful probes
Vanaf versie 2.2.8 van het AppSignal Elixir-pakket kunnen probes status tussen runs doorgeven. Als uw probe een argument neemt, wordt de retourwaarde van de laatste run als waarde voor dat argument doorgegeven in de volgende run.
Een initiële status voor de eerste run van de probe kan worden meegegeven als derde argument aan Appsignal.Probes.register. Als deze niet wordt meegegeven, is de initiële status nil.
Appsignal.Probes.register(:stateful_probe, fn minutes ->
Appsignal.set_gauge("uptime_minutes", minutes)
minutes + 1
end, 0)
Of als een op een module gebaseerde functie:
# lib/my_app/probes/my_probe.ex
defmodule MyApp.MyProbe do
def call(minutes) do
Appsignal.set_gauge("uptime_minutes", minutes)
minutes + 1
end
end
Die u vervolgens als volgt kunt registreren:
Appsignal.Probes.register(:stateful_probe, &MyApp.MyProbe.call/1, 0)
Probes registreren
Probes kunnen worden geregistreerd met de register-methode op de module Appsignal.Probes.
Deze methode accepteert drie argumenten.
key - Dit is de key/naam van de probe. Deze wordt gebruikt om de probe te identificeren in het geval dat er een fout optreedt tijdens het uitvoeren van de probe (die naar het appsignal.log-bestand wordt gelogd) en om een bestaande probe te overschrijven.
probe - Dit is een van de ondersteunde probetypes die elke minuut moet worden aangeroepen om metrics te verzamelen.
state - Dit is de initiële status die aan uw probe wordt doorgegeven. Als uw probe geen status als argument neemt, heeft dit argument geen effect. Het is een optioneel argument en de standaardwaarde is nil.
Om een probe toe te voegen, registreert u deze in de start/2-functie van uw applicatie, vlak voordat de supervisor wordt gestart.
In een Phoenix-app ziet dit er zo uit:
# lib/my_app/application.ex
def start(_type, _args) do
children = [
MyApp.Repo,
MyAppWeb.Endpoint,
]
Appsignal.Probes.register(:my_probe, &MyProbe.call/0)
opts = [strategy: :one_for_one, name: Weekmenu.Supervisor]
Supervisor.start_link(children, opts)
end
Standaardprobes overschrijven
AppSignal wordt geleverd met standaardprobes voor bepaalde integraties. Als deze probe om welke reden dan ook niet correct functioneert of extra configuratie voor uw use case vereist, kunt u de standaardprobe overschrijven door een nieuwe probe te registreren met dezelfde key.
# lib/my_app/application.ex
Appsignal.Probes.register(:erlang, fn() ->
# Do things
end)
Het overschrijven van probes logt een debugbericht in het appsignal.log-bestand, wat kan helpen om te detecteren of een probe correct is overschreven.