# Annotations

LLMS index: [llms.txt](/llms.txt)

---

<!-- markdownlint-disable blanks-around-fences -->
<?code-excerpt path-base="examples/java/spring-starter"?>

Pour la plupart des utilisateurs, l'instrumentation prête à l'emploi est
suffisante et rien de plus n'a besoin d'être fait. Cependant, parfois, les
utilisateurs souhaitent créer des [spans](/docs/concepts/signals/traces/#spans)
pour leur propre code personnalisé sans avoir besoin de faire beaucoup de
changements de code.

Si vous ajoutez l'annotation `WithSpan` à une méthode, la méthode est enveloppée
dans un span. L'annotation `SpanAttribute` vous permet de capturer les arguments
de la méthode comme attributs.

<!-- prettier-ignore-start -->
<?code-excerpt "src/main/java/otel/TracedClass.java"?>
```java
package otel;

import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.instrumentation.annotations.SpanAttribute;
import io.opentelemetry.instrumentation.annotations.WithSpan;
import org.springframework.stereotype.Component;

/** Test WithSpan */
@Component
public class TracedClass {

  @WithSpan
  public void tracedMethod() {}

  @WithSpan(value = "span name")
  public void tracedMethodWithName() {
    Span currentSpan = Span.current();
    currentSpan.addEvent("ADD EVENT TO tracedMethodWithName SPAN");
    currentSpan.setAttribute("isTestAttribute", true);
  }

  @WithSpan(kind = SpanKind.CLIENT)
  public void tracedClientSpan() {}

  public void tracedMethodWithAttribute(@SpanAttribute("attributeName") String parameter) {}
}
```
<!-- prettier-ignore-end -->

<div class="alert alert-primary" role="alert"><div class="h4 alert-heading" role="heading">Note</div>

 Les annotations OpenTelemetry utilisent Spring AOP
basé sur des proxys.

Ces annotations ne fonctionnent que pour les méthodes du proxy. Vous pouvez en
apprendre plus dans la
[documentation Spring](https://docs.spring.io/spring-framework/reference/core/aop/proxying.html).

Dans l'exemple suivant, l'annotation `WithSpan` ne fera rien lorsque le point de
terminaison GET est appelé :

```java
@RestController
public class MyControllerManagedBySpring {

    @GetMapping("/ping")
    public void aMethod() {
        anotherMethod();
    }

    @WithSpan
    public void anotherMethod() {
    }
}
```

</div>


<div class="alert alert-primary" role="alert"><div class="h4 alert-heading" role="heading">Note</div>



Pour pouvoir utiliser les annotations OpenTelemetry, vous devez ajouter la
dépendance Spring Boot Starter AOP à votre projet :

   <ul class="nav nav-tabs" id="tabs-0" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-00-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-00" role="tab"
          data-td-tp-persist="maven (`pom.xml`)" aria-controls="tabs-00-00" aria-selected="true">
        Maven (<code>pom.xml</code>)
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-00-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-01" role="tab"
          data-td-tp-persist="gradle (`build.gradle`)" aria-controls="tabs-00-01" aria-selected="false">
        Gradle (<code>build.gradle</code>)
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-0-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;dependencies&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;groupId&gt;</span>org.springframework.boot<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;artifactId&gt;</span>spring-boot-starter-aop<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/dependencies&gt;</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="n">dependencies</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">implementation</span><span class="p">(</span><span class="s2">&#34;org.springframework.boot:spring-boot-starter-aop&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
    </div>
</div>


</div>


Vous pouvez désactiver les annotations OpenTelemetry en définissant la propriété
`otel.instrumentation.annotations.enabled` à `false`.

Vous pouvez personnaliser le span en utilisant les éléments de l'annotation
`WithSpan` :

| Nom     | Type       | Description          | Valeur par défaut   |
| ------- | ---------- | -------------------- | ------------------- |
| `value` | `String`   | Nom du span          | ClassName.Method    |
| `kind`  | `SpanKind` | Type de span du span | `SpanKind.INTERNAL` |

Vous pouvez définir le nom de l'attribut à partir de l'élément `value` de
l'annotation `SpanAttribute` :

| Nom     | Type     | Description       | Valeur par défaut              |
| ------- | -------- | ----------------- | ------------------------------ |
| `value` | `String` | Nom de l'attribut | Nom du paramètre de la méthode |

## Prochaines étapes {#next-steps}

Au-delà de l'utilisation d'annotations, l'API OpenTelemetry vous permet
d'obtenir un traceur qui peut être utilisé pour
[l'instrumentation personnalisée](../api).
