# アノテーション

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

---

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

ほとんどのユーザーにとっては、すぐに使える計装は完全に十分であり、それ以上何もする必要はありません。
しかし時には、ユーザーが多くのコード変更を必要とせずに、独自のカスタムコードに対して[スパン](/docs/concepts/signals/traces/#spans)を作成したい場合があります。

メソッドに`WithSpan`アノテーションを追加すると、そのメソッドはスパンでラップされます。
`SpanAttribute`アノテーションを使用すると、メソッドの引数を属性としてキャプチャできます。

<!-- 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">注意</div>



OpenTelemetryアノテーションは、プロキシに基づくSpring AOPを使用します。

これらのアノテーションは、プロキシのメソッドに対してのみ機能します。詳細については、[Springドキュメント](https://docs.spring.io/spring-framework/reference/core/aop/proxying.html)を参照してください。

次の例では、GETエンドポイントが呼び出されたときに、`WithSpan`アノテーションは何もしません。

```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">注意</div>



OpenTelemetryアノテーションを使用できるようにするには、Spring BootスターターのAOP依存関係をプロジェクトに追加する必要があります。

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


`otel.instrumentation.annotations.enabled`プロパティを`false`に設定することで、OpenTelemetryアノテーションを無効にできます。

`WithSpan`アノテーションの要素を使用してスパンをカスタマイズできます。

| 名前    | 型         | 説明         | デフォルト値        |
| ------- | ---------- | ------------ | ------------------- |
| `value` | `String`   | スパン名     | ClassName.Method    |
| `kind`  | `SpanKind` | スパンの種類 | `SpanKind.INTERNAL` |

`SpanAttribute`アノテーションの`value`要素から属性名を設定できます。

| 名前    | 型       | 説明   | デフォルト値         |
| ------- | -------- | ------ | -------------------- |
| `value` | `String` | 属性名 | メソッドパラメータ名 |

## 次のステップ {#next-steps}

アノテーションの使用以外にも、OpenTelemetry APIを使用すると、[カスタム計装](../api)に使用できるトレーサーを取得できます。
