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

# Ajouter des données de session de requête

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 Collector", version: "0.6.0" },
{ name: "AppSignal for PHP", version: "0.5.0" },
]}
/>

Par défaut, les intégrations AppSignal suivent les données de session de requête pour les applications web dans les bibliothèques prises en charge.

Vous pouvez définir des données de session de requête personnalisées sur une transaction ou un span. Modifier les données de session écrasera les données définies par les instrumentations AppSignal.

[Toutes les données de session de requête sont filtrées](/guides/filter-data/filter-session-data) par nos intégrations avant d'être envoyées à nos serveurs.

<Warning>
  🔐 N'envoyez pas d'<strong>informations personnelles identifiables (PII)</strong> à AppSignal. Filtrez les PII (par exemple, noms, e-mails) et utilisez un identifiant, un hash ou un identifiant pseudonymisé à la place. <br /> <br /> Utilisez les [Link Templates](https://docs.appsignal.com/application/link-templates) pour les relier dans votre application.
</Warning>

Consultez le tableau ci-dessous pour la liste des valeurs racines acceptées par langage. Chaque objet imbriqué peut contenir des valeurs qui produisent du JSON valide (chaînes, entiers, flottants, booléens, valeurs nulles, etc.).

| Langage    | Valeurs racines acceptées |
| ---------- | ------------------------- |
| Ruby       | Arrays, Hashes            |
| JavaScript | Arrays, Objects           |
| Elixir     | Lists, Maps               |
| Python     | Lists, Maps               |
| Go         | Chaîne sérialisée JSON    |
| Java       | Chaîne sérialisée JSON    |
| PHP        | Arrays, Objects           |

<CodeGroup>
  ```ruby Ruby theme={null}
  # Call `add_session_data` multiple times to set more session data
  Appsignal.add_session_data(
    :user_id => "123",
    :menu => { :type => "hamburger" }
  )
  Appsignal.add_session_data(:menu => { :state => "closed" })
  Appsignal.add_session_data(:menu => { :state => "open" })
  # Session data:
  # {
  #   :user_id => "123",
  #   :menu => { :state => "open" }
  # }
  ```

  ```elixir Elixir theme={null}
  Appsignal.Span.set_sample_data(
    Appsignal.Tracer.root_span,
    "session_data",
    %{user_id: "123", menu: "open"}
  )
  ```

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

  setSessionData({ user_id: "123", menu: "open" });
  ```

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

  set_session_data({"user_id": "123", "menu": "open"})
  ```

  ```go Go theme={null}
  // Additional setup is required to first fetch or create a new span
  import (
  	"encoding/json"

  	"go.opentelemetry.io/otel/attribute"
  	"go.opentelemetry.io/otel/trace"
  )

  session_data := map[string]interface{}{
  	"key1": "value1",
  	"key2": "value2",
  	"nested": map[string]interface{}{
  		"key3": "value3",
  		"key4": "value4",
  	},
  }
  json, _ := json.Marshal(session_data)
  span.SetAttributes(attribute.String("appsignal.request.session_data", string(json)))
  ```

  ```java Java theme={null}
  // Additional setup is required to first fetch or create a new span
  import io.opentelemetry.api.trace.Span;
  // We're using the Jackson JSON library
  // You may need to add it to your project as a dependency
  import com.fasterxml.jackson.databind.ObjectMapper;
  import java.util.HashMap;
  import java.util.Map;

  Map<String, Object> sessionData = new HashMap<>();
  sessionData.put("user_id", "123");
  sessionData.put("menu", "open");

  Map<String, String> nested = new HashMap<>();
  nested.put("key3", "value3");
  nested.put("key4", "value4");
  sessionData.put("nested", nested);

  try {
      ObjectMapper mapper = new ObjectMapper();
      String jsonString = mapper.writeValueAsString(sessionData);

      Span span = Span.current();
      span.setAttribute("appsignal.request.session_data", jsonString);
  } catch (Exception e) {
      // Add error handling here
  }
  ```

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

  $data = [
      'param1' => 'value1',
      'param2' => 'value2',
      'nested' => [
          'param3' => 'value3',
          'param4' => 'value4',
      ],
  ];

  Appsignal::setSessionData($data);
  ```
</CodeGroup>

Pour certains langages, une configuration supplémentaire est requise.
Veuillez suivre les instructions pour ces langages :

* [Go](/go/custom-instrumentation)
* [Java](/java/custom-instrumentation)

<img src="https://mintcdn.com/appsignal-715f5a51/MS9b5WO71lSfD5jG/assets/images/screenshots/sample_data/session-data.png?fit=max&auto=format&n=MS9b5WO71lSfD5jG&q=85&s=33aa45b3b82dd9c45234e7ea4fbf2c19" alt="session_data" width="756" height="212" data-path="assets/images/screenshots/sample_data/session-data.png" />

## Limitations

Si l'application définit plusieurs fois les données de session, le gem Ruby fusionnera les valeurs au niveau racine.
Pour les autres intégrations, seule la dernière valeur définie est stockée.
