Skip to content

Commit 65288a4

Browse files
authored
Merge pull request #384 from gentksb/translate/NINJA-docker-k8s-otel
Translation into Japanese - Hands-On OpenTelemetry, Docker, and K8s
2 parents ee71f9e + b42b20c commit 65288a4

20 files changed

+2461
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
title: EC2インスタンスへの接続
3+
linkTitle: 1. EC2インスタンスへの接続
4+
weight: 1
5+
time: 5 minutes
6+
---
7+
8+
## EC2 インスタンスへ接続
9+
10+
各参加者のために、AWS/EC2 に Ubuntu Linux インスタンスを用意しました。
11+
12+
インストラクターから提供された IP アドレスとパスワードを使用して、以下のいずれかの方法で EC2 インスタンスに接続してください:
13+
14+
- Mac OS / Linux
15+
- ssh splunk@IP アドレス
16+
- Windows 10+
17+
- OpenSSH クライアントを使用
18+
- 以前のバージョンの Windows
19+
- Putty を使用
Lines changed: 343 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,343 @@
1+
---
2+
title: Troubleshoot OpenTelemetry Collector Issues
3+
linkTitle: 10. Troubleshoot OpenTelemetry Collector Issues
4+
weight: 10
5+
time: 20 minutes
6+
---
7+
8+
前のセクションでは、debug エクスポーターをコレクターの設定に追加し、
9+
トレースとログのパイプラインの一部にしました。期待通りに、debug 出力が
10+
エージェントコレクターのログに書き込まれているのが確認できます。
11+
12+
しかし、トレースが o11y cloud に送信されなくなっています。なぜなのかを把握して修正しましょう。
13+
14+
## コレクター設定を確認する
15+
16+
`values.yaml`ファイルを通じてコレクター設定が変更された場合は、
17+
config map を確認してコレクターに実際に適用された設定を確認することが役立ちます:
18+
19+
```bash
20+
kubectl describe cm splunk-otel-collector-otel-agent
21+
```
22+
23+
エージェントコレクター設定のログとトレースのパイプラインを確認しましょう。次のようになっているはずです:
24+
25+
```yaml
26+
pipelines:
27+
logs:
28+
exporters:
29+
- debug
30+
processors:
31+
- memory_limiter
32+
- k8sattributes
33+
- filter/logs
34+
- batch
35+
- resourcedetection
36+
- resource
37+
- resource/logs
38+
- resource/add_environment
39+
receivers:
40+
- filelog
41+
- fluentforward
42+
- otlp
43+
...
44+
traces:
45+
exporters:
46+
- debug
47+
processors:
48+
- memory_limiter
49+
- k8sattributes
50+
- batch
51+
- resourcedetection
52+
- resource
53+
- resource/add_environment
54+
receivers:
55+
- otlp
56+
- jaeger
57+
- smartagent/signalfx-forwarder
58+
- zipkin
59+
```
60+
61+
問題がわかりますか?debug エクスポーターのみがトレースとログのパイプラインに含まれています。
62+
以前のトレースパイプライン設定にあった`otlphttp`と`signalfx`エクスポーターがなくなっています。
63+
これが、もう o11y cloud でトレースが見えなくなった理由です。ログパイプラインについても、`splunk_hec/platform_logs`
64+
エクスポーターが削除されています。
65+
66+
> どのような特定のエクスポーターが以前含まれていたかをどのように知ったか?それを見つけるには、
67+
> 以前のカスタマイズを元に戻してから、config map を確認して
68+
> トレースパイプラインに元々何が含まれていたかを見ることもできました。あるいは、
69+
> [splunk-otel-collector-chart の GitHub リポジトリ](https://github.com/signalfx/splunk-otel-collector-chart/blob/main/examples/default/rendered_manifests/configmap-agent.yaml)
70+
> の例を参照することもでき、これにより Helm チャートで使用されるデフォルトのエージェント設定が分かります。
71+
72+
## これらのエクスポーターはどのように削除されたのか?
73+
74+
`values.yaml`ファイルに追加したカスタマイズを確認しましょう:
75+
76+
```yaml
77+
logsEngine: otel
78+
splunkObservability:
79+
infrastructureMonitoringEventsEnabled: true
80+
agent:
81+
config:
82+
receivers: ...
83+
exporters:
84+
debug:
85+
verbosity: detailed
86+
service:
87+
pipelines:
88+
traces:
89+
exporters:
90+
- debug
91+
logs:
92+
exporters:
93+
- debug
94+
```
95+
96+
`helm upgrade`を使ってコレクターに`values.yaml`ファイルを適用したとき、
97+
カスタム設定は以前のコレクター設定とマージされました。
98+
これが発生すると、リストを含む`yaml`設定のセクション、
99+
例えばパイプラインセクションのエクスポーターのリストは、`values.yaml`ファイルに
100+
含めたもの(debug エクスポーターのみ)で置き換えられます。
101+
102+
## 問題を修正しましょう
103+
104+
既存のパイプラインをカスタマイズする場合、設定のその部分を完全に再定義する必要があります。
105+
したがって、`values.yaml`ファイルを次のように更新する必要があります:
106+
107+
```yaml
108+
logsEngine: otel
109+
splunkObservability:
110+
infrastructureMonitoringEventsEnabled: true
111+
agent:
112+
config:
113+
receivers: ...
114+
exporters:
115+
debug:
116+
verbosity: detailed
117+
service:
118+
pipelines:
119+
traces:
120+
exporters:
121+
- otlphttp
122+
- signalfx
123+
- debug
124+
logs:
125+
exporters:
126+
- splunk_hec/platform_logs
127+
- debug
128+
```
129+
130+
変更を適用しましょう:
131+
132+
```bash
133+
helm upgrade splunk-otel-collector \
134+
--set="splunkObservability.realm=$REALM" \
135+
--set="splunkObservability.accessToken=$ACCESS_TOKEN" \
136+
--set="clusterName=$INSTANCE-cluster" \
137+
--set="environment=otel-$INSTANCE" \
138+
--set="splunkPlatform.token=$HEC_TOKEN" \
139+
--set="splunkPlatform.endpoint=$HEC_URL" \
140+
--set="splunkPlatform.index=splunk4rookies-workshop" \
141+
-f values.yaml \
142+
splunk-otel-collector-chart/splunk-otel-collector
143+
```
144+
145+
それからエージェント config map を確認します:
146+
147+
```bash
148+
kubectl describe cm splunk-otel-collector-otel-agent
149+
```
150+
151+
今度は、ログとトレースの両方について完全に定義されたエクスポーターパイプラインが表示されるはずです:
152+
153+
```bash
154+
pipelines:
155+
logs:
156+
exporters:
157+
- splunk_hec/platform_logs
158+
- debug
159+
processors:
160+
...
161+
traces:
162+
exporters:
163+
- otlphttp
164+
- signalfx
165+
- debug
166+
processors:
167+
...
168+
```
169+
170+
## ログ出力の確認
171+
172+
**Splunk Distribution of OpenTelemetry .NET**は、ログに使用するアプリケーション
173+
(サンプルアプリでも使用している)から、トレースコンテキストで強化されたログを自動的にエクスポートします。
174+
175+
アプリケーションログはトレースメタデータで強化され、その後
176+
OpenTelemetry Collector のローカルインスタンスに OTLP 形式でエクスポートされます。
177+
178+
debug エクスポーターによってキャプチャされたログを詳しく見て、それが発生しているかを確認しましょう。
179+
コレクターログを tail するには、次のコマンドを使用できます:
180+
181+
```bash
182+
kubectl logs -l component=otel-collector-agent -f
183+
```
184+
185+
ログを tail したら、curl を使ってさらにトラフィックを生成できます。そうすると
186+
次のようなものが表示されるはずです:
187+
188+
```
189+
2024-12-20T21:56:30.858Z info Logs {"kind": "exporter", "data_type": "logs", "name": "debug", "resource logs": 1, "log records": 1}
190+
2024-12-20T21:56:30.858Z info ResourceLog #0
191+
Resource SchemaURL: https://opentelemetry.io/schemas/1.6.1
192+
Resource attributes:
193+
-> splunk.distro.version: Str(1.8.0)
194+
-> telemetry.distro.name: Str(splunk-otel-dotnet)
195+
-> telemetry.distro.version: Str(1.8.0)
196+
-> os.type: Str(linux)
197+
-> os.description: Str(Debian GNU/Linux 12 (bookworm))
198+
-> os.build_id: Str(6.8.0-1021-aws)
199+
-> os.name: Str(Debian GNU/Linux)
200+
-> os.version: Str(12)
201+
-> host.name: Str(derek-1)
202+
-> process.owner: Str(app)
203+
-> process.pid: Int(1)
204+
-> process.runtime.description: Str(.NET 8.0.11)
205+
-> process.runtime.name: Str(.NET)
206+
-> process.runtime.version: Str(8.0.11)
207+
-> container.id: Str(5bee5b8f56f4b29f230ffdd183d0367c050872fefd9049822c1ab2aa662ba242)
208+
-> telemetry.sdk.name: Str(opentelemetry)
209+
-> telemetry.sdk.language: Str(dotnet)
210+
-> telemetry.sdk.version: Str(1.9.0)
211+
-> service.name: Str(helloworld)
212+
-> deployment.environment: Str(otel-derek-1)
213+
-> k8s.node.name: Str(derek-1)
214+
-> k8s.cluster.name: Str(derek-1-cluster)
215+
ScopeLogs #0
216+
ScopeLogs SchemaURL:
217+
InstrumentationScope HelloWorldController
218+
LogRecord #0
219+
ObservedTimestamp: 2024-12-20 21:56:28.486804 +0000 UTC
220+
Timestamp: 2024-12-20 21:56:28.486804 +0000 UTC
221+
SeverityText: Information
222+
SeverityNumber: Info(9)
223+
Body: Str(/hello endpoint invoked by {name})
224+
Attributes:
225+
-> name: Str(Kubernetes)
226+
Trace ID: 78db97a12b942c0252d7438d6b045447
227+
Span ID: 5e9158aa42f96db3
228+
Flags: 1
229+
{"kind": "exporter", "data_type": "logs", "name": "debug"}
230+
```
231+
232+
この例では、Trace ID と Span ID が
233+
OpenTelemetry .NET 計装によってログ出力に自動的に書き込まれていることがわかります。これにより、
234+
Splunk Observability Cloud でログとトレースを関連付けることができます。
235+
236+
ただし、Helm を使って K8s クラスターに OpenTelemetry collector をデプロイし、
237+
ログ収集オプションを含める場合、OpenTelemetry collector は File Log receiver を使用して
238+
コンテナーログを自動的にキャプチャすることを覚えておいてください。
239+
240+
これにより、アプリケーションの重複ログがキャプチャされることになります。例えば、次のスクリーンショットでは
241+
サービスへの各リクエストに対して 2 つのログエントリーが表示されています:
242+
243+
![Duplicate Log Entries](../images/duplicate_logs.png)
244+
245+
これをどのように回避しますか?
246+
247+
## K8s での重複ログの回避
248+
249+
重複ログをキャプチャしないようにするには、`OTEL_LOGS_EXPORTER`環境変数を`none`に設定して、
250+
Splunk Distribution of OpenTelemetry .NET が OTLP を使用してコレクターにログをエクスポートしないようにできます。
251+
これは、`deployment.yaml`ファイルに`OTEL_LOGS_EXPORTER`環境変数を追加することで実行できます:
252+
253+
```yaml
254+
env:
255+
- name: PORT
256+
value: "8080"
257+
- name: NODE_IP
258+
valueFrom:
259+
fieldRef:
260+
fieldPath: status.hostIP
261+
- name: OTEL_EXPORTER_OTLP_ENDPOINT
262+
value: "http://$(NODE_IP):4318"
263+
- name: OTEL_SERVICE_NAME
264+
value: "helloworld"
265+
- name: OTEL_RESOURCE_ATTRIBUTES
266+
value: "deployment.environment=otel-$INSTANCE"
267+
- name: OTEL_LOGS_EXPORTER
268+
value: "none"
269+
```
270+
271+
それから次を実行します:
272+
273+
```bash
274+
# update the deployment
275+
kubectl apply -f deployment.yaml
276+
```
277+
278+
`OTEL_LOGS_EXPORTER`環境変数を`none`に設定するのは簡単です。しかし、Trace ID と
279+
Span ID はアプリケーションによって生成された stdout ログに書き込まれないため、
280+
ログとトレースを関連付けることができなくなります。
281+
282+
これを解決するには、
283+
`/home/splunk/workshop/docker-k8s-otel/helloworld/SplunkTelemetryConfigurator.cs`で定義されている例のような、カスタムロガーを定義する必要があります。
284+
285+
次のように`Program.cs`ファイルを更新することで、これをアプリケーションに含めることができます:
286+
287+
```cs
288+
using SplunkTelemetry;
289+
using Microsoft.Extensions.Logging.Console;
290+
291+
var builder = WebApplication.CreateBuilder(args);
292+
293+
builder.Services.AddControllers();
294+
295+
SplunkTelemetryConfigurator.ConfigureLogger(builder.Logging);
296+
297+
var app = builder.Build();
298+
299+
app.MapControllers();
300+
301+
app.Run();
302+
```
303+
304+
その後、カスタムログ設定を含む新しい Docker イメージをビルドします:
305+
306+
```bash
307+
cd /home/splunk/workshop/docker-k8s-otel/helloworld
308+
309+
docker build -t helloworld:1.3 .
310+
```
311+
312+
それから更新されたイメージを Kubernetes にインポートします:
313+
314+
```bash
315+
cd /home/splunk
316+
317+
# Export the image from docker
318+
docker save --output helloworld.tar helloworld:1.3
319+
320+
# Import the image into k3s
321+
sudo k3s ctr images import helloworld.tar
322+
```
323+
324+
最後に、`deployment.yaml`ファイルを更新してコンテナーイメージの 1.3 バージョンを使用する必要があります:
325+
326+
```yaml
327+
spec:
328+
containers:
329+
- name: helloworld
330+
image: docker.io/library/helloworld:1.3
331+
```
332+
333+
それから変更を適用します:
334+
335+
```bash
336+
# update the deployment
337+
kubectl apply -f deployment.yaml
338+
```
339+
340+
これで重複したログエントリーが排除されたことがわかります。そして
341+
残りのログエントリーは JSON としてフォーマットされ、span と trace ID が含まれています:
342+
343+
![JSON Format Logs](../images/logs_json_format.png)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
title: Summary
3+
linkTitle: 11. Summary
4+
weight: 11
5+
time: 2 minutes
6+
---
7+
8+
このワークショップでは、以下の概念についてハンズオンで体験しました:
9+
10+
- Linux ホストに**Splunk Distribution of the OpenTelemetry Collector**をデプロイする方法。
11+
- **Splunk Distribution of OpenTelemetry .NET**で.NET アプリケーションを計装する方法。
12+
- .NET アプリケーションを「Docker 化」し、**Splunk Distribution of OpenTelemetry .NET**で計装する方法。
13+
- Helm を使用して Kubernetes クラスターに**Splunk Distribution of the OpenTelemetry Collector**をデプロイする方法。
14+
- コレクター設定をカスタマイズして問題をトラブルシューティングする方法。
15+
16+
他の言語と環境で OpenTelemetry がどのように計装されるかを確認するには、
17+
[Splunk OpenTelemetry Examples GitHub リポジトリ](https://github.com/signalfx/splunk-opentelemetry-examples)をご覧ください。
18+
19+
将来このワークショップを独自に実行するには、これらの手順を参照して、Splunk Show の**Splunk4Rookies - Observability**
20+
ワークショップテンプレートを使用して EC2 インスタンスをプロビジョニングしてください。

0 commit comments

Comments
 (0)