Namespaces sind eine Möglichkeit, Fehlervorfälle, Performance-Vorfälle und Metriken aus Aktionen zu gruppieren. AppSignal verwendet standardmäßig drei Namespaces:
web für Web-Anfragen
frontend für Front-end-JavaScript
background für Background-Jobs
Anwendungen können eine beliebige Anzahl von Namespaces haben. Sie könnten beispielsweise einen separaten Namespace für das Administrationspanel, die API oder geplante Aufgaben Ihrer Anwendung haben. Dieser Leitfaden geht durch die Schritte, die erforderlich sind, um Aktionen in benutzerdefinierten Namespaces zu melden.
Namespaces konfigurieren
Namespaces werden durch den Code Ihrer Anwendung definiert. Mit kleinen Helfern können Sie den Namespace einer Aktion anpassen. Dieser Leitfaden zeigt Ihnen, wie Sie Anfragen in verschiedene Namespaces aufteilen. Für diesen Leitfaden erstellen wir einen “admin”- und einen “critical”-Namespace für Background-Jobs.
Namespace-Namen dürfen nur Buchstaben (a-z) und Unterstriche enthalten
Wir empfehlen, nicht mehr als 15 Namespaces pro Anwendung zu haben.
Konfigurationen pro Sprache
Ruby
In Rails können wir den before_action-Callback verwenden, um eine Methode aufzurufen, bevor eine Anfrage verarbeitet wird. Im untenstehenden Codebeispiel haben wir einen before_action erstellt, der die Methode set_appsignal_namespace aufruft. In dieser Methode rufen wir die Appsignal.set_namespace-Hilfsmethode auf, um “admin” als Namespace für diese Anfrage zu konfigurieren. Dies funktioniert auch, wenn andere Controller Unterklassen des AdminController sind.
# In einem Rails-Controller
# app/controllers/admin_controller.rb
class AdminController < ApplicationController
before_action :set_appsignal_namespace
def set_appsignal_namespace
# Konfiguriert alle Aktionen in diesem Controller, um
# im "admin"-Namespace zu melden
Appsignal.set_namespace("admin")
end
# Andere Controller-Aktionen
end
Als Nächstes definieren wir den Namespace des Codes, der von den Sidekiq-Background-Workern unserer Anwendung ausgeführt wird. Um in unserem Background-Worker ausgelöste Fehler korrekt mit einem Namespace zu versehen, müssen wir den Namespace definieren, bevor anderer Code ausgeführt wird. Im untenstehenden Sidekiq-Worker-Codebeispiel tun wir dies sofort in der perform-Methode in Zeile 7.
# In einem Sidekiq-Worker
# app/workers/critical_worker.rb
class CriticalWorker
include Sidekiq::Worker
def perform
# Konfiguriert die Jobs dieses Workers, um im "critical"-Namespace zu melden
Appsignal.set_namespace("critical")
# Der eigentliche Worker-Code
end
end
Es ist auch möglich, den Namespace beim Erstellen einer Transaktion mit dem Appsignal.monitor-Helfer zu konfigurieren. Er akzeptiert den Namespace als Schlüsselwortargument.
# Beim Erstellen einer neuen Transaktion
Appsignal.monitor(namespace: "admin") do
# Ihr zu instrumentierender Code
end
Für Transaktionen, die bereits erstellt wurden, können Sie die set_namespace-Methode verwenden, um den Namespace der Transaktion zu konfigurieren, wie im untenstehenden Beispiel:
# Beim späteren Ändern des Namespace für eine Transaktion
transaction.set_namespace("slow_admin")
Ein Hinweis zur Helfer-Position
Die in diesem Leitfaden verwendeten set_namespace-Helfer können in jeder Aktion aufgerufen werden, die Teil eines AppSignal-Samples ist. Wir empfehlen, dies so früh wie möglich in der Anfrage oder im Background-Job aufzurufen, sodass die Transaktion mit dem angegebenen Namespace konfiguriert wird, bevor ein Fehler auftritt. Andernfalls, wenn ein Fehler auftritt oder etwas anderes den Prozess stoppt, wird die Transaktion an AppSignal gesendet, bevor der set_namespace-Helfer aufgerufen wird, und das Sample wird stattdessen unter dem Standard-Namespace gemeldet.
Mehr lesen
Elixir
In Phoenix-Controllern verwenden wir ein plug, um eine Funktion aufzurufen, bevor die Anfrage von Phoenix verarbeitet wird. Im untenstehenden Codebeispiel verwenden wir plug, um die Funktion set_appsignal_namespace aufzurufen (Zeile 5). In dieser Funktion rufen wir den Appsignal.Span.set_namespace-Helfer auf, um den Namespace für diese Anfrage zu konfigurieren (Zeile 10).
# In einem Phoenix-Controller
defmodule AppsignalPhoenixExampleWeb.AdminController do
use AppsignalPhoenixExampleWeb, :controller
plug :set_appsignal_namespace
defp set_appsignal_namespace(conn, _params) do
# Konfiguriert alle Aktionen in diesem Controller, um
# im "admin"-Namespace zu melden
Appsignal.Span.set_namespace(Appsignal.Tracer.root_span(), "admin")
conn
end
# ...
end
Als Nächstes konfigurieren wir den Namespace für einen Background-Job. Um alle Fehler von innerhalb des Jobs innerhalb des gewünschten Namespaces abzufangen, muss Appsignal.Span.set_namespace am Anfang der Funktion vor anderem Code aufgerufen werden, wie in Zeile 4 des untenstehenden Codebeispiels:
defmodule MyApp.CriticalJob do
def run do
# Konfiguriert die Jobs dieses Workers, um im "critical"-Namespace zu melden
Appsignal.Span.set_namespace(Appsignal.Tracer.root_span(), "critical")
# Der eigentliche Worker-Code
end
end
Es ist auch möglich, den Namespace beim Erstellen einer Transaktion zu konfigurieren. Bitte konsultieren Sie die Dokumentation für Decorators oder Instrumentation Helpers für weitere Informationen zur Konfiguration von Namespaces.
Ein Hinweis zur Helfer-Position
Die in diesem Leitfaden verwendeten set_namespace-Helfer können in jeder Aktion aufgerufen werden, die eine AppSignal-Transaktion startet. Wir empfehlen, dies so früh wie möglich in der Anfrage oder im Background-Job aufzurufen, sodass die Transaktion mit dem angegebenen Namespace konfiguriert wird, bevor ein Fehler auftritt. Andernfalls, wenn ein Fehler auftritt – oder etwas anderes den Prozess stoppt – wird die Transaktion an AppSignal gesendet, bevor der set_namespace-Code aufgerufen wird, und sie wird stattdessen unter dem Standard-Namespace gemeldet.
Mehr lesen
Node.js
In Node.js-Anwendungen arbeitet AppSignal mit OpenTelemetry, das Spans zur Nachverfolgung von Metadaten verwendet, z. B. zu welchem Namespace ein Span gehört. Verwenden Sie die Hilfsfunktion setNamespace wie unten gezeigt, um den Namespace für den Trace des aktiven Spans festzulegen.
import { setNamespace } from "@appsignal/nodejs";
setNamespace("custom-namespace");
Mehr darüber lesen, wie Spans in Node.js funktionieren.
PHP
In PHP-Anwendungen arbeitet AppSignal mit OpenTelemetry, das Spans zur Nachverfolgung von Metadaten verwendet, z. B. zu welchem Namespace ein Span gehört. Verwenden Sie die Hilfsmethode Appsignal::setNamespace, um den Namespace für den Trace des aktiven Spans festzulegen.
Appsignal::setNamespace("admin");
Wenn Sie diese Hilfsmethode mehrmals innerhalb eines einzelnen Traces aufrufen, verwendet AppSignal den Aufruf, dessen Span den neuesten Zeitstempel hat.
Mehr darüber lesen, wie benutzerdefinierte Instrumentierung in PHP funktioniert.
Python
In Python-Anwendungen arbeitet AppSignal mit OpenTelemetry, das Spans zur Nachverfolgung von Metadaten verwendet, z. B. zu welchem Namespace ein Span gehört. Verwenden Sie die Hilfsfunktion set_namespace wie unten gezeigt, um den Namespace für den Trace des aktiven Spans festzulegen.
from appsignal import set_namespace
set_namespace("custom-namespace")
Mehr darüber lesen, wie Spans in Python funktionieren.
Front-end JavaScript
In Front-end-JavaScript-Anwendungen arbeitet AppSignal mit Spans, um Metadaten wie den Namespace eines Spans zu verfolgen.
Anders als Ruby, Node.js, PHP und Python verfügt die Front-end-JavaScript-API nicht
über einen globalen setNamespace / set_namespace-Helfer. Stattdessen setzen Sie,
wie bei Elixir, Go und Java, den Namespace direkt am Span.
Beim Erstellen dieses Spans rufen Sie setNamespace mit einem String-Wert des gewünschten Namespace-Namens auf, wie im untenstehenden Beispiel gezeigt:
const span = appsignal.createSpan();
span.setNamespace("admin"); // ein benutzerdefinierter Namespace für diesen Span (Standard ist `frontend`)
Mehr darüber lesen, wie Spans in Front-End-JavaScript funktionieren.
In Go-Anwendungen arbeitet AppSignal mit OpenTelemetry, das Spans zur Nachverfolgung von Metadaten verwendet, z. B. zu welchem Namespace ein Span gehört. Setzen Sie an einem beliebigen Span im Trace ein Attribut appsignal.namespace mit einem String-Wert des neuen Namespaces.
span.SetAttributes(attribute.String("appsignal.namespace", "admin"))
Bitte konsultieren Sie die Go-Dokumentation zur benutzerdefinierten Instrumentierung, wie Sie einen Span abrufen oder einen neuen erstellen.
Wenn mehrere Attribute mit dem appsignal.namespace-Attribut gefunden werden, ist der Span mit dem neuesten Zeitstempel maßgebend.
Mehr darüber lesen, wie benutzerdefinierte Instrumentierung in Go funktioniert.
Java
In Java-Anwendungen arbeitet AppSignal mit OpenTelemetry, das Spans zur Nachverfolgung von Metadaten verwendet, z. B. zu welchem Namespace ein Span gehört. Setzen Sie an einem beliebigen Span im Trace ein Attribut appsignal.namespace mit einem String-Wert des neuen Namespaces.
span.setAttribute("appsignal.namespace", "admin");
Bitte konsultieren Sie die Java-Dokumentation zur benutzerdefinierten Instrumentierung, wie Sie einen Span abrufen oder einen neuen erstellen.
Wenn mehrere Attribute mit dem appsignal.namespace-Attribut gefunden werden, ist der Span mit dem neuesten Zeitstempel maßgebend.
Mehr darüber lesen, wie benutzerdefinierte Instrumentierung in Java funktioniert.
Deployment
Wenn Ihre Anwendung mit ihren neuen Namespace-Helfern konfiguriert ist, committen Sie Ihre Änderungen und deployen Sie die App. Wenn die App startet/neu startet, meldet AppSignal Aktionen unter ihrem neuen Namespace 🥳!
Daten aus alten Deployments bleiben nach ihrem ursprünglichen Namespace gruppiert. Nur
neu gemeldete Aktionen werden nach ihren neuen Namespaces gruppiert.
Werden Namespaces nicht korrekt gemeldet? Keine Panik, melden Sie sich bei uns und wir helfen Ihnen weiter!
Weiterführende Literatur