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

# Benutzerdefinierte Daten hinzufügen

export const Compatibility = ({versions = [], label = "Available in"}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const defaultPillStyle = {
    borderColor: "#d4d4d8",
    background: "#f4f4f5",
    color: "#3f3f46"
  };
  const pillStyles = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#d8b4fe",
      color: "#6b21a8"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#5eead4",
      color: "#115e59"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde047",
      color: "#854d0e"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#86efac",
      color: "#166534"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#93c5fd",
      color: "#1e40af"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fca5a5",
      color: "#991b1b"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fdba74",
      color: "#9a3412"
    }
  };
  const getPillStyle = name => ({
    ...defaultPillStyle,
    ...pillStyles[name] || ({})
  });
  return <div className="not-prose my-4 rounded-lg border border-zinc-200 bg-zinc-50 px-4 py-3 text-sm dark:border-white/10 dark:bg-white/5">
      <div className="flex flex-wrap items-center gap-x-2 gap-y-1">
        <span className="font-semibold text-zinc-700 dark:text-zinc-200">
          {label}:
        </span>
        {versions.map((v, i) => <span key={`${v.name}-${v.version}-${i}`} className="inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium" style={getPillStyle(v.name)}>
            <span>{v.name}</span>
            <span className="opacity-70">
              {v.version}
              {v.exact ? "" : "+"}
            </span>
          </span>)}
      </div>
    </div>;
};

<Compatibility
  versions={[
{ name: "AppSignal for Ruby", version: "4.0.0" },
{ name: "AppSignal for Elixir", version: "1.0.0" },
{ name: "AppSignal for Node.js", version: "3.0.0" },
{ name: "AppSignal for Python", version: "0.3.0" },
{ name: "AppSignal for PHP", version: "0.5.0" },
]}
/>

Sie können benutzerdefinierte Sample-Daten verwenden, um dynamischere Werte zu setzen, als es mit [anderen Arten der Datenanpassung](/guides/custom-data) möglich ist.

<Warning>
  🔐 Senden Sie keine <strong>personenbezogenen Daten (Personal Identifiable Information, PII)</strong> an AppSignal. Filtern Sie PII (z. B. Namen, E-Mail-Adressen) und verwenden Sie stattdessen eine ID, einen Hash oder einen pseudonymisierten Bezeichner. <br /> <br /> Verwenden Sie [Link Templates](https://docs.appsignal.com/application/link-templates), um sie in Ihrer Anwendung zurückzuverknüpfen.
</Warning>

Die folgende Tabelle enthält eine Liste der akzeptierten Stammwerte pro Sprache. Jedes verschachtelte Objekt kann Werte enthalten, die zu gültigem JSON führen (Strings, Integer, Floats, Booleans, Nulls usw.).

| Sprache    | Akzeptierte Stammwerte |
| ---------- | ---------------------- |
| Ruby       | Arrays, Hashes         |
| JavaScript | Arrays, Objekte        |
| Elixir     | Lists, Maps            |
| Python     | Lists, Maps            |
| PHP        | Arrays, Objekte        |

Es ist nicht möglich, die als benutzerdefinierte Daten festgelegten Daten zu filtern oder zu durchsuchen. Sie bieten nur einen zusätzlichen Bereich in der Benutzeroberfläche, um weitere Metadaten aufzulisten.

Wenn Sie benutzerdefinierte Daten für verschachtelte Objekte verwenden, können Sie das Objekt auf der Incident-Sample-Seite sowohl für Exception- als auch Performance-Samples als JSON formatiert anzeigen, wie im folgenden Beispiel:

<CodeGroup>
  ```ruby Ruby theme={null}
  # Rufen Sie `add_custom_data` mehrmals auf, um weitere benutzerdefinierte Daten hinzuzufügen
  # Hash-Beispiel
  Appsignal.add_custom_data(
    :stroopwaffle => { :caramel => true },
    :market => { :type => "outdoors" }
  )
  Appsignal.add_custom_data(:market => { :state => :closed })
  Appsignal.add_custom_data(:market => { :state => :open })
  # Benutzerdefinierte Daten:
  # {
  #   :stroopwaffle => { :caramel => true },
  #   :market => { :state => :open }
  # }

  # Array-Beispiel
  Appsignal.add_custom_data(["value 1"])
  Appsignal.add_custom_data(["value 2"])
  # Benutzerdefinierte Daten: ["value 1", "value 2"]

  # Beispiel für gemischte Datentypen
  # Die Datentypen Hash und Array können auf der obersten Ebene nicht gemischt werden
  Appsignal.add_custom_data(:market => :open)
  Appsignal.add_custom_data(["value 1"])
  # Benutzerdefinierte Daten: ["value 1"]
  ```

  ```elixir Elixir theme={null}
  # Map
  Appsignal.Span.set_sample_data(
    Appsignal.Tracer.root_span,
    "custom_data",
    %{
      stroopwaffle: %{
        caramel: true,
        origin: "market"
      }
    }
  )

  # List
  Appsignal.Span.set_sample_data(
    Appsignal.Tracer.root_span,
    "custom_data",
    [
      "value 1",
      "value 2"
    ]
  )
  ```

  ```javascript Node.js theme={null}
  import { setCustomData } from "@appsignal/nodejs";

  // Object
  setCustomData({
    stroopwaffle: {
      caramel: true,
      origin: "market",
    },
  });

  // Array
  setCustomData(["value 1", "value 2"]);
  ```

  ```python Python theme={null}
  from appsignal import set_custom_data

  # Map
  set_custom_data({
    "stroopwaffle": {
      "caramel": true,
      "origin": "market"
    }
  })

  # Array
  set_custom_data(["value 1", "value 2"])
  ```

  ```php PHP theme={null}
  <?php
  use Appsignal\Appsignal;

  Appsignal::setCustomData([
      'stroopwaffle' => [
          'caramel' => true,
          'origin' => 'market',
      ],
  ]);
  ```
</CodeGroup>

Wenn die Anwendung benutzerdefinierte Daten mehrmals setzt, führt das Ruby-Gem die Werte auf der Stammebene zusammen. Für andere Integrationen wird nur der zuletzt gesetzte Wert gespeichert.

<img src="https://mintcdn.com/appsignal-715f5a51/MS9b5WO71lSfD5jG/assets/images/screenshots/sample_data/custom-data.png?fit=max&auto=format&n=MS9b5WO71lSfD5jG&q=85&s=0219d24992c0f08a2cd65e2ced181c1e" alt="custom_data" width="756" height="310" data-path="assets/images/screenshots/sample_data/custom-data.png" />
