> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Gruppieren mit Namespaces

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.

<Tip>
  Möchten Sie mehr darüber erfahren, wofür Namespaces verwendet werden können? Schauen Sie sich diese Liste an:
  [Was können Sie mit Namespaces tun?](/application/namespaces#what-can-you-do-with-namespaces)
</Tip>

<Frame caption="Das obige Bild zeigt Beispieldiagramme mit mehreren Namespaces, die eine GraphQL-API und den Web-Namespace aufteilen.">
  <img src="https://mintcdn.com/appsignal-715f5a51/4TRZP0Sq9Zq7PAPW/assets/images/screenshots/namespaces/graphs.png?fit=max&auto=format&n=4TRZP0Sq9Zq7PAPW&q=85&s=044f86ecbea3baac50432a8337ae69b2" alt="App Graphs Namespaces" width="1025" height="647" data-path="assets/images/screenshots/namespaces/graphs.png" />
</Frame>

## 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.

<Tip>
  Namespace-Namen dürfen nur Buchstaben (a-z) und Unterstriche enthalten
  <br /> Wir empfehlen, nicht mehr als **15** Namespaces pro Anwendung zu haben.
</Tip>

#### Konfigurationen pro Sprache

* [Ruby](#ruby)
* [Elixir](#elixir)
* [Node.js](#nodejs)
* [Python](#python)
* [Front-end JavaScript](#front-end-javascript)
* [Go](#go)
* [Java](#java)
* [PHP](#php)

### 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][ruby helper] auf, um "admin" als Namespace für diese Anfrage zu konfigurieren. Dies funktioniert auch, wenn andere Controller Unterklassen des `AdminController` sind.

<CodeGroup>
  ```ruby Ruby theme={null}
  # 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
  ```
</CodeGroup>

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.

<CodeGroup>
  ```ruby Ruby theme={null}
  # 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
  ```
</CodeGroup>

Es ist auch möglich, den Namespace beim Erstellen einer Transaktion mit dem [`Appsignal.monitor`](https://rubydoc.info/gems/appsignal/Appsignal/Helpers/Instrumentation#monitor-instance_method)-Helfer zu konfigurieren. Er akzeptiert den Namespace als Schlüsselwortargument.

<CodeGroup>
  ```ruby Ruby theme={null}
  # Beim Erstellen einer neuen Transaktion
  Appsignal.monitor(namespace: "admin") do
    # Ihr zu instrumentierender Code
  end
  ```
</CodeGroup>

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:

<CodeGroup>
  ```ruby Ruby theme={null}
  # Beim späteren Ändern des Namespace für eine Transaktion
  transaction.set_namespace("slow_admin")
  ```
</CodeGroup>

##### 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

* [Dokumentation der Hilfsmethode `Appsignal.set_namespace`][ruby helper]

### 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][elixir helper] auf, um den Namespace für diese Anfrage zu konfigurieren (Zeile 10).

<CodeGroup>
  ```elixir Elixir theme={null}
  # 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
  ```
</CodeGroup>

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:

<CodeGroup>
  ```elixir Elixir theme={null}
  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
  ```
</CodeGroup>

Es ist auch möglich, den Namespace beim Erstellen einer Transaktion zu konfigurieren. Bitte konsultieren Sie die Dokumentation für [Decorators][elixir namespace_decorator] oder [Instrumentation Helpers][elixir namespace_helper] 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

* [Dokumentation der Hilfsmethode `Appsignal.Span.set_namespace`][elixir helper]
* [Elixir-Namespace-Decorator][elixir namespace_decorator]
* [Elixir-Namespace-Instrumentation-Helper][elixir namespace_helper]

### 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.

<CodeGroup>
  ```javascript Node.js theme={null}
  import { setNamespace } from "@appsignal/nodejs";

  setNamespace("custom-namespace");
  ```
</CodeGroup>

[Mehr darüber lesen, wie Spans in Node.js funktionieren](/nodejs/3.x/instrumentation/instrumentation).

### 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.

<CodeGroup>
  ```php PHP theme={null}
  Appsignal::setNamespace("admin");
  ```
</CodeGroup>

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][php custom instrumentation].

[php custom instrumentation]: /php/instrumentation.html

### 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.

<CodeGroup>
  ```python Python theme={null}
  from appsignal import set_namespace

  set_namespace("custom-namespace")
  ```
</CodeGroup>

[Mehr darüber lesen, wie Spans in Python funktionieren](/python/instrumentation/instrumentation).

### Front-end JavaScript

In Front-end-JavaScript-Anwendungen arbeitet AppSignal mit Spans, um Metadaten wie den Namespace eines Spans zu verfolgen.

<Tip>
  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.
</Tip>

Beim Erstellen dieses Spans rufen Sie `setNamespace` mit einem `String`-Wert des gewünschten Namespace-Namens auf, wie im untenstehenden Beispiel gezeigt:

<CodeGroup>
  ```javascript JavaScript theme={null}
  const span = appsignal.createSpan();
  span.setNamespace("admin"); // ein benutzerdefinierter Namespace für diesen Span (Standard ist `frontend`)
  ```
</CodeGroup>

[Mehr darüber lesen, wie Spans in Front-End-JavaScript funktionieren](/front-end/span).

### Go

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.

<CodeGroup>
  ```go Go theme={null}
  span.SetAttributes(attribute.String("appsignal.namespace", "admin"))
  ```
</CodeGroup>

Bitte konsultieren Sie die [Go-Dokumentation zur benutzerdefinierten Instrumentierung][go custom instrumentation], 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][go custom instrumentation].

[go custom instrumentation]: /go/custom-instrumentation.html

### 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.

<CodeGroup>
  ```java Java theme={null}
  span.setAttribute("appsignal.namespace", "admin");
  ```
</CodeGroup>

Bitte konsultieren Sie die [Java-Dokumentation zur benutzerdefinierten Instrumentierung][java custom instrumentation], 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][java custom instrumentation].

[java custom instrumentation]: /java/custom-instrumentation.html

## 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 🥳!

<Tip>
  Daten aus alten Deployments bleiben nach ihrem ursprünglichen Namespace gruppiert. Nur
  neu gemeldete Aktionen werden nach ihren neuen Namespaces gruppiert.
</Tip>

Werden Namespaces nicht korrekt gemeldet? Keine Panik, [melden Sie sich bei uns][contact] und wir helfen Ihnen weiter!

## Weiterführende Literatur

* [App-Daten filtern][filtering]
* [Namespaces][namespaces]
* [Namespaces ignorieren][ignoring namespaces]

[contact]: mailto:support@appsignal.com

[elixir helper]: https://hexdocs.pm/appsignal/Appsignal.Span.html?#set_namespace/2

[elixir namespace_decorator]: /elixir/instrumentation/instrumentation.html#decorator-namespaces

[elixir namespace_helper]: /elixir/instrumentation/instrumentation.html#helper-namespaces

[filtering]: /guides/filter-data/

[ignoring namespaces]: /guides/filter-data/ignore-namespaces.html

[namespaces]: /application/namespaces.html

[Namespaces]: /application/namespaces.html

[ruby helper]: https://gemdocs.org/gems/appsignal/3.4.0/Appsignal/Transaction.html#initialize-instance_method

[tagging]: /guides/tagging.html
