Skip to content

Commit f5d96e3

Browse files
apply advice to exclude snapshot_id attribute
1 parent d7f72ef commit f5d96e3

File tree

4 files changed

+78
-93
lines changed

4 files changed

+78
-93
lines changed

instrumentation/iceberg-1.8/library/src/main/java/io/opentelemetry/instrumentation/iceberg/v1_8/IcebergMetricsReporter.java

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@
88
import io.opentelemetry.api.OpenTelemetry;
99
import io.opentelemetry.api.common.AttributeKey;
1010
import io.opentelemetry.api.common.Attributes;
11+
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogramBuilder;
12+
import io.opentelemetry.api.incubator.metrics.ExtendedLongCounterBuilder;
1113
import io.opentelemetry.api.metrics.DoubleHistogram;
14+
import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
1215
import io.opentelemetry.api.metrics.LongCounter;
16+
import io.opentelemetry.api.metrics.LongCounterBuilder;
1317
import io.opentelemetry.api.metrics.Meter;
18+
import java.util.List;
1419
import org.apache.iceberg.metrics.CounterResult;
1520
import org.apache.iceberg.metrics.MetricsReport;
1621
import org.apache.iceberg.metrics.MetricsReporter;
@@ -28,6 +33,10 @@ final class IcebergMetricsReporter implements MetricsReporter {
2833
AttributeKey.stringKey("iceberg.scan.state");
2934
private static final AttributeKey<String> DELETE_TYPE =
3035
AttributeKey.stringKey("iceberg.delete_file.type");
36+
private static final List<AttributeKey<?>> advice1 = List.of(SCHEMA_ID, TABLE_NAME);
37+
private static final List<AttributeKey<?>> advice2 = List.of(SCHEMA_ID, TABLE_NAME, SCAN_STATE);
38+
private static final List<AttributeKey<?>> advice3 =
39+
List.of(SCHEMA_ID, TABLE_NAME, SCAN_STATE, DELETE_TYPE);
3140
private final DoubleHistogram planningDuration;
3241
private final LongCounter dataFilesCount;
3342
private final LongCounter dataFilesSize;
@@ -38,13 +47,18 @@ final class IcebergMetricsReporter implements MetricsReporter {
3847

3948
IcebergMetricsReporter(OpenTelemetry openTelemetry) {
4049
Meter meter = openTelemetry.getMeter(INSTRUMENTATION_NAME);
41-
planningDuration = ScanMetricsBuilder.totalPlanningDuration(meter, "s");
42-
dataFilesCount = ScanMetricsBuilder.dataFilesCount(meter);
43-
dataFilesSize = ScanMetricsBuilder.dataFilesSize(meter);
44-
deleteFilesCount = ScanMetricsBuilder.deleteFilesCount(meter);
45-
deleteFilesSize = ScanMetricsBuilder.deleteFilesSize(meter);
46-
dataManifestsCount = ScanMetricsBuilder.dataManifestsCount(meter);
47-
deleteManifestsCount = ScanMetricsBuilder.deleteManifestsCount(meter);
50+
planningDuration =
51+
applyAdvice(advice1, ScanMetricsBuilderFactory.totalPlanningDuration(meter, "s")).build();
52+
dataFilesCount = applyAdvice(advice2, ScanMetricsBuilderFactory.dataFilesCount(meter)).build();
53+
dataFilesSize = applyAdvice(advice1, ScanMetricsBuilderFactory.dataFilesSize(meter)).build();
54+
deleteFilesCount =
55+
applyAdvice(advice3, ScanMetricsBuilderFactory.deleteFilesCount(meter)).build();
56+
deleteFilesSize =
57+
applyAdvice(advice1, ScanMetricsBuilderFactory.deleteFilesSize(meter)).build();
58+
dataManifestsCount =
59+
applyAdvice(advice2, ScanMetricsBuilderFactory.dataManifestsCount(meter)).build();
60+
deleteManifestsCount =
61+
applyAdvice(advice2, ScanMetricsBuilderFactory.deleteManifestsCount(meter)).build();
4862
}
4963

5064
@Override
@@ -227,4 +241,22 @@ private static void addValueToLongCounter(
227241
attributes.toBuilder().put(att1Key, att1Value).put(att2Key, att2Value).build();
228242
metric.add(measurement, newAttributes);
229243
}
244+
245+
private static LongCounterBuilder applyAdvice(
246+
List<AttributeKey<?>> attributeKeys, LongCounterBuilder builder) {
247+
if (builder instanceof ExtendedLongCounterBuilder) {
248+
return ((ExtendedLongCounterBuilder) builder).setAttributesAdvice(attributeKeys);
249+
}
250+
251+
return builder;
252+
}
253+
254+
private static DoubleHistogramBuilder applyAdvice(
255+
List<AttributeKey<?>> attributeKeys, DoubleHistogramBuilder builder) {
256+
if (builder instanceof ExtendedDoubleHistogramBuilder) {
257+
return ((ExtendedDoubleHistogramBuilder) builder).setAttributesAdvice(attributeKeys);
258+
}
259+
260+
return builder;
261+
}
230262
}

instrumentation/iceberg-1.8/library/src/main/java/io/opentelemetry/instrumentation/iceberg/v1_8/IcebergTelemetry.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55

66
package io.opentelemetry.instrumentation.iceberg.v1_8;
77

8+
import io.opentelemetry.api.OpenTelemetry;
89
import org.apache.iceberg.Scan;
910
import org.apache.iceberg.ScanTask;
1011
import org.apache.iceberg.ScanTaskGroup;
1112

12-
import io.opentelemetry.api.OpenTelemetry;
13-
1413
/** Entrypoint for instrumenting Apache Iceberg scan metrics */
1514
public final class IcebergTelemetry {
1615
private final OpenTelemetry openTelemetry;
@@ -25,9 +24,12 @@ public static IcebergTelemetry create(OpenTelemetry openTelemetry) {
2524
}
2625

2726
/**
28-
* Creates a new {@link Scan} instance based on an existing {@link Scan} instance. The new instance is associated
29-
* with a custom {@link org.apache.iceberg.metrics.MetricsReporter} that reports scan metrics using the configured {@link OpenTelemetry} instance.
30-
* @param <T1> the child class, returned by method chaining, e.g., {@link Scan#project(org.apache.iceberg.Schema)}
27+
* Creates a new {@link Scan} instance based on an existing {@link Scan} instance. The new
28+
* instance is associated with a custom {@link org.apache.iceberg.metrics.MetricsReporter} that
29+
* reports scan metrics using the configured {@link OpenTelemetry} instance.
30+
*
31+
* @param <T1> the child class, returned by method chaining, e.g., {@link
32+
* Scan#project(org.apache.iceberg.Schema)}
3133
* @param <T2> the type of tasks produces by this scan
3234
* @param <T3> the type of task groups produces by this scan
3335
* @param scan the original scan instance that will be instrumented
Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
package io.opentelemetry.instrumentation.iceberg.v1_8;
77

8-
import io.opentelemetry.api.metrics.DoubleHistogram;
9-
import io.opentelemetry.api.metrics.LongCounter;
8+
import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
9+
import io.opentelemetry.api.metrics.LongCounterBuilder;
1010
import io.opentelemetry.api.metrics.Meter;
1111

12-
final class ScanMetricsBuilder {
12+
final class ScanMetricsBuilderFactory {
1313
private static final String ROOT = "iceberg.scan";
1414
private static final String TOTAL_PLANNING_DURATION = ROOT + ".planning.duration";
1515

@@ -20,63 +20,56 @@ final class ScanMetricsBuilder {
2020
private static final String DATA_MANIFESTS_COUNT = ROOT + ".data_manifests.count";
2121
private static final String DELETE_MANIFESTS_COUNT = ROOT + ".delete_manifests.count";
2222

23-
private ScanMetricsBuilder() {
23+
private ScanMetricsBuilderFactory() {
2424
// prevents instantiation
2525
}
2626

27-
static DoubleHistogram totalPlanningDuration(Meter meter, String unit) {
27+
static DoubleHistogramBuilder totalPlanningDuration(Meter meter, String unit) {
2828
return meter
2929
.histogramBuilder(TOTAL_PLANNING_DURATION)
3030
.setDescription("The total duration needed to plan the scan.")
31-
.setUnit(unit)
32-
.build();
31+
.setUnit(unit);
3332
}
3433

35-
static LongCounter dataFilesCount(Meter meter) {
34+
static LongCounterBuilder dataFilesCount(Meter meter) {
3635
return meter
3736
.counterBuilder(DATA_FILES_COUNT)
3837
.setDescription("The number of data files.")
39-
.setUnit("{file}")
40-
.build();
38+
.setUnit("{file}");
4139
}
4240

43-
static LongCounter deleteFilesCount(Meter meter) {
41+
static LongCounterBuilder deleteFilesCount(Meter meter) {
4442
return meter
4543
.counterBuilder(DELETE_FILES_COUNT)
4644
.setDescription("The number of delete files.")
47-
.setUnit("{file}")
48-
.build();
45+
.setUnit("{file}");
4946
}
5047

51-
static LongCounter dataManifestsCount(Meter meter) {
48+
static LongCounterBuilder dataManifestsCount(Meter meter) {
5249
return meter
5350
.counterBuilder(DATA_MANIFESTS_COUNT)
5451
.setDescription("The number of data manifests.")
55-
.setUnit("{file}")
56-
.build();
52+
.setUnit("{file}");
5753
}
5854

59-
static LongCounter deleteManifestsCount(Meter meter) {
55+
static LongCounterBuilder deleteManifestsCount(Meter meter) {
6056
return meter
6157
.counterBuilder(DELETE_MANIFESTS_COUNT)
6258
.setDescription("The number of delete manifests.")
63-
.setUnit("{file}")
64-
.build();
59+
.setUnit("{file}");
6560
}
6661

67-
static LongCounter dataFilesSize(Meter meter) {
62+
static LongCounterBuilder dataFilesSize(Meter meter) {
6863
return meter
6964
.counterBuilder(DATA_FILES_SIZE)
7065
.setDescription("The total size of all scanned data files.")
71-
.setUnit("By")
72-
.build();
66+
.setUnit("By");
7367
}
7468

75-
static LongCounter deleteFilesSize(Meter meter) {
69+
static LongCounterBuilder deleteFilesSize(Meter meter) {
7670
return meter
7771
.counterBuilder(DELETE_FILES_SIZE)
7872
.setDescription("The total size of all scanned delete files.")
79-
.setUnit("By")
80-
.build();
73+
.setUnit("By");
8174
}
8275
}

instrumentation/iceberg-1.8/testing/src/main/java/io/opentelemetry/instrumentation/iceberg/v1_8/AbstractIcebergTest.java

Lines changed: 14 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,7 @@ private void assertScanDurationMetric(ScanReport expectedReport) {
140140
expectedReport.schemaId()),
141141
equalTo(
142142
stringKey("iceberg.table.name"),
143-
expectedReport.tableName()),
144-
equalTo(
145-
longKey("iceberg.snapshot.id"),
146-
expectedReport.snapshotId())))));
143+
expectedReport.tableName())))));
147144
}
148145

149146
private void assertDataFilesCountMetrics(ScanReport expectedReport) {
@@ -168,10 +165,7 @@ private void assertDataFilesCountMetrics(ScanReport expectedReport) {
168165
expectedReport.schemaId()),
169166
equalTo(
170167
stringKey("iceberg.table.name"),
171-
expectedReport.tableName()),
172-
equalTo(
173-
longKey("iceberg.snapshot.id"),
174-
expectedReport.snapshotId())),
168+
expectedReport.tableName())),
175169
longSumAssert ->
176170
longSumAssert
177171
.hasValue(
@@ -183,10 +177,7 @@ private void assertDataFilesCountMetrics(ScanReport expectedReport) {
183177
expectedReport.schemaId()),
184178
equalTo(
185179
stringKey("iceberg.table.name"),
186-
expectedReport.tableName()),
187-
equalTo(
188-
longKey("iceberg.snapshot.id"),
189-
expectedReport.snapshotId())))));
180+
expectedReport.tableName())))));
190181
}
191182

192183
private void assertDataManifestCountMetrics(ScanReport expectedReport) {
@@ -214,10 +205,7 @@ private void assertDataManifestCountMetrics(ScanReport expectedReport) {
214205
expectedReport.schemaId()),
215206
equalTo(
216207
stringKey("iceberg.table.name"),
217-
expectedReport.tableName()),
218-
equalTo(
219-
longKey("iceberg.snapshot.id"),
220-
expectedReport.snapshotId())),
208+
expectedReport.tableName())),
221209
longSumAssert ->
222210
longSumAssert
223211
.hasValue(
@@ -232,10 +220,7 @@ private void assertDataManifestCountMetrics(ScanReport expectedReport) {
232220
expectedReport.schemaId()),
233221
equalTo(
234222
stringKey("iceberg.table.name"),
235-
expectedReport.tableName()),
236-
equalTo(
237-
longKey("iceberg.snapshot.id"),
238-
expectedReport.snapshotId())))));
223+
expectedReport.tableName())))));
239224
}
240225

241226
private void assertDeleteManifestCountMetrics(ScanReport expectedReport) {
@@ -263,10 +248,7 @@ private void assertDeleteManifestCountMetrics(ScanReport expectedReport) {
263248
expectedReport.schemaId()),
264249
equalTo(
265250
stringKey("iceberg.table.name"),
266-
expectedReport.tableName()),
267-
equalTo(
268-
longKey("iceberg.snapshot.id"),
269-
expectedReport.snapshotId())),
251+
expectedReport.tableName())),
270252
longSumAssert ->
271253
longSumAssert
272254
.hasValue(
@@ -281,10 +263,7 @@ private void assertDeleteManifestCountMetrics(ScanReport expectedReport) {
281263
expectedReport.schemaId()),
282264
equalTo(
283265
stringKey("iceberg.table.name"),
284-
expectedReport.tableName()),
285-
equalTo(
286-
longKey("iceberg.snapshot.id"),
287-
expectedReport.snapshotId())))));
266+
expectedReport.tableName())))));
288267
}
289268

290269
private void assertDeleteFilesCountMetrics(ScanReport expectedReport) {
@@ -313,10 +292,7 @@ private void assertDeleteFilesCountMetrics(ScanReport expectedReport) {
313292
expectedReport.schemaId()),
314293
equalTo(
315294
stringKey("iceberg.table.name"),
316-
expectedReport.tableName()),
317-
equalTo(
318-
longKey("iceberg.snapshot.id"),
319-
expectedReport.snapshotId())),
295+
expectedReport.tableName())),
320296
longSumAssert ->
321297
longSumAssert
322298
.hasValue(
@@ -332,10 +308,7 @@ private void assertDeleteFilesCountMetrics(ScanReport expectedReport) {
332308
expectedReport.schemaId()),
333309
equalTo(
334310
stringKey("iceberg.table.name"),
335-
expectedReport.tableName()),
336-
equalTo(
337-
longKey("iceberg.snapshot.id"),
338-
expectedReport.snapshotId())),
311+
expectedReport.tableName())),
339312
longSumAssert ->
340313
longSumAssert
341314
.hasValue(
@@ -352,10 +325,7 @@ private void assertDeleteFilesCountMetrics(ScanReport expectedReport) {
352325
expectedReport.schemaId()),
353326
equalTo(
354327
stringKey("iceberg.table.name"),
355-
expectedReport.tableName()),
356-
equalTo(
357-
longKey("iceberg.snapshot.id"),
358-
expectedReport.snapshotId())),
328+
expectedReport.tableName())),
359329
longSumAssert ->
360330
longSumAssert
361331
.hasValue(
@@ -372,10 +342,7 @@ private void assertDeleteFilesCountMetrics(ScanReport expectedReport) {
372342
expectedReport.schemaId()),
373343
equalTo(
374344
stringKey("iceberg.table.name"),
375-
expectedReport.tableName()),
376-
equalTo(
377-
longKey("iceberg.snapshot.id"),
378-
expectedReport.snapshotId())),
345+
expectedReport.tableName())),
379346
longSumAssert ->
380347
longSumAssert
381348
.hasValue(
@@ -392,10 +359,7 @@ private void assertDeleteFilesCountMetrics(ScanReport expectedReport) {
392359
expectedReport.schemaId()),
393360
equalTo(
394361
stringKey("iceberg.table.name"),
395-
expectedReport.tableName()),
396-
equalTo(
397-
longKey("iceberg.snapshot.id"),
398-
expectedReport.snapshotId())),
362+
expectedReport.tableName())),
399363
longSumAssert ->
400364
longSumAssert
401365
.hasValue(expectedReport.scanMetrics().dvs().value())
@@ -407,10 +371,7 @@ private void assertDeleteFilesCountMetrics(ScanReport expectedReport) {
407371
expectedReport.schemaId()),
408372
equalTo(
409373
stringKey("iceberg.table.name"),
410-
expectedReport.tableName()),
411-
equalTo(
412-
longKey("iceberg.snapshot.id"),
413-
expectedReport.snapshotId())))));
374+
expectedReport.tableName())))));
414375
}
415376

416377
private void assertSizeMetric(
@@ -434,10 +395,7 @@ private void assertSizeMetric(
434395
expectedReport.schemaId()),
435396
equalTo(
436397
stringKey("iceberg.table.name"),
437-
expectedReport.tableName()),
438-
equalTo(
439-
longKey("iceberg.snapshot.id"),
440-
expectedReport.snapshotId())))));
398+
expectedReport.tableName())))));
441399
}
442400

443401
static final class SimpleReporter implements MetricsReporter {

0 commit comments

Comments
 (0)