Skip to content

Commit 767baa8

Browse files
committed
Merge remote-tracking branch 'upstream/main' into alt
# Conflicts: # instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version35Test/java/io/opentelemetry/javaagent/instrumentation/vertx/rx/v3_5/server/VertxReactivePropagationTest.java # instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version41Test/java/io/opentelemetry/javaagent/instrumentation/vertx/rx/v3_5/server/VertxReactivePropagationTest.java # instrumentation/vertx/vertx-rx-java-3.5/javaagent/src/version5Test/java/io/opentelemetry/javaagent/instrumentation/vertx/rx/v3_5/server/VertxReactivePropagationTest.java
2 parents c0c9a43 + e64d78a commit 767baa8

139 files changed

Lines changed: 628 additions & 628 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.fossa.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ targets:
420420
target: ':instrumentation:cassandra:cassandra-4.4:library'
421421
- type: gradle
422422
path: ./
423-
target: ':instrumentation:clickhouse:clickhouse-client-common:javaagent'
423+
target: ':instrumentation:clickhouse:clickhouse-client-common-0.5:javaagent'
424424
- type: gradle
425425
path: ./
426426
target: ':instrumentation:clickhouse:clickhouse-client-v1-0.5:javaagent'
@@ -1131,7 +1131,7 @@ targets:
11311131
target: ':instrumentation:play:play-ws:play-ws-2.1:javaagent'
11321132
- type: gradle
11331133
path: ./
1134-
target: ':instrumentation:play:play-ws:play-ws-common:javaagent'
1134+
target: ':instrumentation:play:play-ws:play-ws-common-1.0:javaagent'
11351135
- type: gradle
11361136
path: ./
11371137
target: ':instrumentation:reactor:reactor-netty:reactor-netty-0.9:javaagent'

.github/agents/knowledge/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Load only files relevant to the current scope to reduce noise and avoid over-con
1515
| `gradle-conventions.md` | `build.gradle.kts` or `settings.gradle.kts` changes, custom test task registration or wiring |
1616
| `javaagent-advice-patterns.md` | ByteBuddy `@Advice` class or advice-method changes |
1717
| `javaagent-module-patterns.md` | `InstrumentationModule`, `TypeInstrumentation`, `VirtualField`, `CallDepth` |
18-
| `javaagent-singletons-patterns.md` | `*Singletons` holder classes, singleton accessors, callers of singleton accessors/fields |
18+
| `javaagent-singletons-patterns.md` | `*Singletons`, `*SpanNaming`, and similar holder classes; singleton accessors; callers of singleton accessors/fields |
1919
| `library-patterns.md` | Library instrumentation telemetry, builder, getter, or setter pattern changes |
2020
| `module-naming.md` | New or renamed modules or packages; settings includes |
2121
| `testing-general-patterns.md` | Test files in scope — assertion style, test method signatures and throws clauses, resource cleanup patterns, attribute assertion patterns, `satisfies()` lambda usage |

.github/agents/knowledge/general-rules.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ When a "Knowledge File" is listed, load it from `knowledge/` before reviewing th
2121
| Naming | Module/package naming | New or renamed modules/packages | `module-naming.md` |
2222
| Javaagent | Advice patterns | `@Advice` classes | `javaagent-advice-patterns.md` |
2323
| Javaagent | Module structure patterns | `InstrumentationModule`, `TypeInstrumentation` | `javaagent-module-patterns.md` |
24-
| Javaagent | Singletons patterns | `*Singletons` holder classes, singleton accessors, callers of singleton accessors/fields | `javaagent-singletons-patterns.md` |
24+
| Javaagent | Singletons patterns | `*Singletons`, `*SpanNaming`, and similar holder classes; singleton accessors; callers of singleton accessors/fields | `javaagent-singletons-patterns.md` |
2525
| Javaagent | Incorrect `classLoaderMatcher()` | `classLoaderMatcher()` override that is redundant (muzzle already handles it) or missing when needed (muzzle cannot distinguish version range) | `javaagent-module-patterns.md` |
2626
| Semconv | Library vs javaagent semconv constant usage | Semconv constants/assertions ||
2727
| Semconv | Dual semconv testing | `SemconvStability`, `maybeStable`, semconv Gradle tasks | `testing-semconv-stability.md` |
@@ -105,7 +105,8 @@ Reason about visibility from "what does the advice method directly reference?".
105105
## [Style] `@SuppressWarnings` Usage
106106

107107
- Place `@SuppressWarnings` on the single member that needs it, or on the class when two
108-
or more members in the class need the same suppression.
108+
or more members in the class need the same suppression. Do not move an existing
109+
suppression from a member to the class unless multiple members need it.
109110
- **Do not add `@SuppressWarnings("deprecation")` unless the build fails without it.**
110111
The project disables javac's `-Xlint:deprecation` globally and uses a custom Error Prone
111112
check (`OtelDeprecatedApiUsage`) instead. Only add the annotation when it is actually

.github/agents/knowledge/javaagent-singletons-patterns.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
## Quick Reference
44

5-
- Use when: reviewing `*Singletons` holder classes and their callers
5+
- Use when: reviewing `*Singletons`, `*SpanNaming`, and similar holder classes and their callers
66
- Review focus: field/accessor naming, eager initialization, singleton accessor call sites
77

88
Javaagent modules keep shared `Instrumenter` instances and related collaborators in a dedicated
9-
`Singletons` holder class such as `MyLibrarySingletons`.
9+
`Singletons` holder class such as `MyLibrarySingletons`. Some modules also use focused helper
10+
holders such as `*ServerSpanNaming` for shared span-name or route-name collaborators; apply the
11+
same accessor and call-site rules when these classes expose stored singleton fields.
1012

1113
## Rules
1214

@@ -18,8 +20,10 @@ Javaagent modules keep shared `Instrumenter` instances and related collaborators
1820
- For exported collaborators, keep the field `private`, use a lower camel case field name, and
1921
give the accessor method the exact same name as the field. Do not prefix these accessors with
2022
`get`. This rule applies only to zero-arg methods that directly return a stored singleton
21-
field; methods that take arguments or compute a value are not singleton accessors and keep
22-
their normal names (including `get*` when appropriate).
23+
field. It applies regardless of whether the holder class is named `*Singletons`,
24+
`*ServerSpanNaming`, or another focused holder name. Methods that take arguments or compute a
25+
value are not singleton accessors and keep their normal names (including `get*` when
26+
appropriate).
2327
- `instrumenter` -> `instrumenter()`
2428
- `helper` -> `helper()`
2529
- `setter` -> `setter()`
@@ -32,7 +36,9 @@ Javaagent modules keep shared `Instrumenter` instances and related collaborators
3236
- `RESPONSE_STATUS` stays `RESPONSE_STATUS`
3337
- Callers should static import only exported singleton accessors and uppercase constant-like
3438
fields, and use those members unqualified: accessors for lower camel collaborators, fields for
35-
uppercase constant-like members.
39+
uppercase constant-like members. This includes route/span naming accessors such as
40+
`serverSpanName()` when they simply return a stored `HttpServerRouteGetter` or similar
41+
collaborator.
3642
- Keep verb-named helper methods as verbs when they perform work instead of returning a stored
3743
field. These methods are not singleton accessors and should not be static imported under this
3844
rule.

.github/agents/knowledge/testing-general-patterns.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,20 @@
9797
`equalTo(AttributeKey<Long>, int)` overload, so `equalTo(longKey("iteration"), iteration)` is
9898
preferred over `equalTo(longKey("iteration"), (long) iteration)`.
9999

100+
## Metric Assertions
101+
102+
- Prefer `InstrumentationExtension.waitAndAssertMetrics(...)` for metric assertions. It waits
103+
until the supplied assertion passes, so fixed sleeps such as `Thread.sleep(100)`
104+
usually unnecessary and make tests slower and more fragile.
105+
- `DbConnectionPoolMetricsAssertions.assertConnectionPoolEmitsMetrics()` already uses
106+
`waitAndAssertMetrics(...)` for each expected pool metric. Keep the pool state being asserted
107+
valid until this method returns; for example, if the assertion expects a `used` connection point,
108+
keep the borrowed connection open until after the assertion.
109+
- After removing a metric-producing source or unregistering an observable callback, call
110+
`testing().clearData()` and then use `waitAndAssertMetrics(..., AbstractIterableAssert::isEmpty)`
111+
for absence checks. Do not add an exporter-interval sleep before or after `clearData()` solely to
112+
wait for metrics; the test runners force-flush metrics when reading them.
113+
100114
## Attribute Assertion `satisfies()` Lambda Parameters
101115

102116
**Attribute-assertion `satisfies()` lambda parameters are `AbstractAssert` instances, not raw

.github/config/latest-dep-versions.json

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"com.github.etaty:rediscala_2.11#+": "1.9.0",
4242
"com.github.etaty:rediscala_2.12#+": "1.9.0",
4343
"com.github.etaty:rediscala_2.13#+": "1.9.0",
44-
"com.github.oshi:oshi-core#+": "6.12.0",
44+
"com.github.oshi:oshi-core#+": "7.0.0",
4545
"com.google.guava:guava#+": "33.6.0-jre",
4646
"com.google.gwt:gwt-servlet#+": "2.10.0",
4747
"com.google.http-client:google-http-client#+": "2.1.0",
@@ -64,9 +64,9 @@
6464
"com.oracle.database.jdbc:ojdbc8#+": "23.26.1.0.0",
6565
"com.oracle.database.jdbc:ucp#+": "23.26.1.0.0",
6666
"com.rabbitmq:amqp-client#+": "5.30.0",
67-
"com.softwaremill.sttp.tapir:tapir-pekko-http-server_2.12#+": "1.13.17",
68-
"com.softwaremill.sttp.tapir:tapir-pekko-http-server_2.13#+": "1.13.17",
69-
"com.softwaremill.sttp.tapir:tapir-pekko-http-server_3#+": "1.13.17",
67+
"com.softwaremill.sttp.tapir:tapir-pekko-http-server_2.12#+": "1.13.18",
68+
"com.softwaremill.sttp.tapir:tapir-pekko-http-server_2.13#+": "1.13.18",
69+
"com.softwaremill.sttp.tapir:tapir-pekko-http-server_3#+": "1.13.18",
7070
"com.sparkjava:spark-core#+": "2.9.4",
7171
"com.squareup.okhttp3:okhttp#+": "5.3.2",
7272
"com.squareup.okhttp:okhttp#+": "2.7.5",
@@ -135,11 +135,11 @@
135135
"io.dropwizard:dropwizard-client#+": "5.0.1",
136136
"io.dropwizard:dropwizard-views#+": "5.0.1",
137137
"io.github.rediscala:rediscala_2.13#+": "1.17.0",
138-
"io.grpc:grpc-core#+": "1.80.0",
139-
"io.grpc:grpc-netty#+": "1.80.0",
140-
"io.grpc:grpc-protobuf#+": "1.80.0",
141-
"io.grpc:grpc-services#+": "1.80.0",
142-
"io.grpc:grpc-stub#+": "1.80.0",
138+
"io.grpc:grpc-core#+": "1.81.0",
139+
"io.grpc:grpc-netty#+": "1.81.0",
140+
"io.grpc:grpc-protobuf#+": "1.81.0",
141+
"io.grpc:grpc-services#+": "1.81.0",
142+
"io.grpc:grpc-stub#+": "1.81.0",
143143
"io.helidon.webserver:helidon-webserver#+": "4.4.1",
144144
"io.javalin:javalin#+": "7.2.0",
145145
"io.javalin:javalin#6.+": "6.7.0",
@@ -184,7 +184,7 @@
184184
"io.projectreactor:reactor-test#+": "3.8.5",
185185
"io.quarkus.platform:quarkus-bom#3.5.+": "3.5.3",
186186
"io.quarkus.platform:quarkus-bom#3.9.+": "3.9.5",
187-
"io.quarkus:quarkus-rest#+": "3.35.0",
187+
"io.quarkus:quarkus-rest#+": "3.35.1",
188188
"io.quarkus:quarkus-resteasy-reactive#+": "3.15.7",
189189
"io.r2dbc:r2dbc-spi#+": "1.0.0.RELEASE",
190190
"io.ratpack:ratpack-core#+": "1.9.0",
@@ -346,7 +346,7 @@
346346
"org.eclipse.jetty:jetty-servlet#10.+": "10.0.26",
347347
"org.eclipse.jetty:jetty-servlet#7.+": "7.6.21.v20160908",
348348
"org.eclipse.jetty:jetty-webapp#10.+": "10.0.26",
349-
"org.elasticsearch.client:elasticsearch-rest-client#+": "9.3.3",
349+
"org.elasticsearch.client:elasticsearch-rest-client#+": "9.3.4",
350350
"org.elasticsearch.client:elasticsearch-rest-client#6.+": "6.8.23",
351351
"org.elasticsearch.client:elasticsearch-rest-client#6.3.+": "6.3.2",
352352
"org.elasticsearch.client:rest#+": "5.5.3",
@@ -361,7 +361,7 @@
361361
"org.elasticsearch.plugin:transport-netty4-client#+": "7.17.29",
362362
"org.elasticsearch.plugin:transport-netty4-client#6.+": "6.8.23",
363363
"org.elasticsearch.plugin:transport-netty4-client#6.4.+": "6.4.3",
364-
"org.elasticsearch:elasticsearch#+": "9.3.3",
364+
"org.elasticsearch:elasticsearch#+": "9.3.4",
365365
"org.glassfish.grizzly:grizzly-http#+": "5.0.1",
366366
"org.glassfish.grizzly:grizzly-http#4.+": "4.0.2",
367367
"org.glassfish.grizzly:grizzly-http-server#4.+": "4.0.2",
@@ -373,7 +373,7 @@
373373
"org.glassfish.jersey.core:jersey-server#2.+": "2.48",
374374
"org.glassfish.jersey.inject:jersey-hk2#+": "4.0.2",
375375
"org.glassfish.jersey.inject:jersey-hk2#2.+": "2.48",
376-
"org.glassfish:jakarta.faces#+": "4.1.7",
376+
"org.glassfish:jakarta.faces#+": "4.1.8",
377377
"org.glassfish:jakarta.faces#3.+": "3.0.5",
378378
"org.glassfish:javax.faces#+": "2.4.0",
379379
"org.glassfish:javax.faces#2.+": "2.4.0",
@@ -414,9 +414,9 @@
414414
"org.jodd:jodd-http#+": "6.3.0",
415415
"org.mongodb:mongo-java-driver#+": "3.12.14",
416416
"org.mongodb:mongodb-driver-async#+": "3.12.14",
417-
"org.mongodb:mongodb-driver-core#+": "5.6.5",
418-
"org.mongodb:mongodb-driver-reactivestreams#+": "5.6.5",
419-
"org.mongodb:mongodb-driver-sync#+": "5.6.5",
417+
"org.mongodb:mongodb-driver-core#+": "5.7.0",
418+
"org.mongodb:mongodb-driver-reactivestreams#+": "5.7.0",
419+
"org.mongodb:mongodb-driver-sync#+": "5.7.0",
420420
"org.mybatis:mybatis#+": "3.5.19",
421421
"org.opensearch.client:opensearch-java#+": "3.8.0",
422422
"org.opensearch.client:opensearch-rest-client#+": "3.6.0",
@@ -527,20 +527,20 @@
527527
"redis.clients:jedis#2.+": "2.10.2",
528528
"redis.clients:jedis#3.+": "3.10.0",
529529
"software.amazon.awssdk.crt:aws-crt#+": "0.45.2",
530-
"software.amazon.awssdk:aws-core#+": "2.43.1",
531-
"software.amazon.awssdk:aws-json-protocol#+": "2.43.1",
532-
"software.amazon.awssdk:bedrockruntime#+": "2.43.1",
533-
"software.amazon.awssdk:dynamodb#+": "2.43.1",
534-
"software.amazon.awssdk:ec2#+": "2.43.1",
535-
"software.amazon.awssdk:kinesis#+": "2.43.1",
536-
"software.amazon.awssdk:lambda#+": "2.43.1",
537-
"software.amazon.awssdk:rds#+": "2.43.1",
538-
"software.amazon.awssdk:s3#+": "2.43.0",
539-
"software.amazon.awssdk:secretsmanager#+": "2.43.1",
540-
"software.amazon.awssdk:ses#+": "2.43.1",
541-
"software.amazon.awssdk:sfn#+": "2.43.1",
542-
"software.amazon.awssdk:sns#+": "2.43.1",
543-
"software.amazon.awssdk:sqs#+": "2.43.1",
530+
"software.amazon.awssdk:aws-core#+": "2.43.2",
531+
"software.amazon.awssdk:aws-json-protocol#+": "2.43.2",
532+
"software.amazon.awssdk:bedrockruntime#+": "2.43.2",
533+
"software.amazon.awssdk:dynamodb#+": "2.43.2",
534+
"software.amazon.awssdk:ec2#+": "2.43.2",
535+
"software.amazon.awssdk:kinesis#+": "2.43.2",
536+
"software.amazon.awssdk:lambda#+": "2.43.2",
537+
"software.amazon.awssdk:rds#+": "2.43.2",
538+
"software.amazon.awssdk:s3#+": "2.43.2",
539+
"software.amazon.awssdk:secretsmanager#+": "2.43.2",
540+
"software.amazon.awssdk:ses#+": "2.43.2",
541+
"software.amazon.awssdk:sfn#+": "2.43.2",
542+
"software.amazon.awssdk:sns#+": "2.43.2",
543+
"software.amazon.awssdk:sqs#+": "2.43.2",
544544
"tech.powerjob:powerjob-official-processors#+": "5.1.2",
545545
"tech.powerjob:powerjob-worker#+": "5.1.2"
546546
}

.github/repository-settings.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ Secrets:
1717
- `GPG_PRIVATE_KEY` - stored in OpenTelemetry-Java 1Password
1818
- `GRADLE_PUBLISH_KEY` - owned by [@trask](https://github.com/trask)
1919
- `GRADLE_PUBLISH_SECRET` - owned by [@trask](https://github.com/trask)
20+
- `SONATYPE_GUIDE_PAT` - owned by [@trask](https://github.com/trask)
2021
- `SONATYPE_KEY` - owned by [@trask](https://github.com/trask)
21-
- `SONATYPE_OSS_INDEX_PASSWORD` - owned by [@trask](https://github.com/trask)
22-
- `SONATYPE_OSS_INDEX_USER` - owned by [@trask](https://github.com/trask)
2322
- `SONATYPE_USER` - owned by [@trask](https://github.com/trask)
2423

2524
## Secrets and variables > Actions

.github/scripts/pull-request-dashboard.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -429,12 +429,14 @@ def fetch_pr_context(
429429

430430
# Last substantive event = last event whose body is non-empty OR whose
431431
# kind is not "review:COMMENTED" (state changes always count). Merge
432-
# commits (≥2 parents — e.g. "Update branch" merging base into the PR)
433-
# don't count as substantive: they don't move the conversation forward.
432+
# commits (≥2 parents) by someone *other* than the author — e.g. an
433+
# approver clicking "Update branch" — don't count as substantive: they
434+
# don't move the conversation forward and shouldn't be confused with
435+
# the author addressing feedback.
434436
def is_substantive(e: dict[str, Any]) -> bool:
435437
if e["kind"].startswith("review:") and e["kind"] != "review:COMMENTED":
436438
return True
437-
if e.get("is_merge"):
439+
if e.get("is_merge") and (e.get("login") or "").lower() != author.lower():
438440
return False
439441
return bool((e.get("body") or "").strip())
440442

@@ -443,16 +445,34 @@ def is_substantive(e: dict[str, Any]) -> bool:
443445

444446
# Commit summaries (subject only) for the brief table in the rendered
445447
# context. Full commit messages and diffs travel via timeline events.
448+
# Merge commits authored by someone other than the PR author (e.g. an
449+
# approver clicking "Update branch") are flagged so the model doesn't
450+
# treat them as the author addressing feedback.
446451
commit_rows = []
447452
for c in recent_commits:
448-
sha = (c.get("sha") or "")[:7]
453+
sha_full = c.get("sha") or ""
454+
sha = sha_full[:7]
449455
msg = (c.get("commit") or {}).get("message", "").splitlines()[0] if c.get("commit") else ""
450456
a = c.get("author") or {}
451457
commit_login = a.get("login") or ((c.get("commit") or {}).get("author") or {}).get("name") or "?"
452458
commit_date = ((c.get("commit") or {}).get("author") or {}).get("date") or ""
453-
commit_rows.append({"sha": sha, "msg": msg, "author": commit_login, "date": commit_date})
459+
is_non_author_merge = (
460+
sha_full in merge_shas
461+
and (commit_login or "").lower() != author.lower()
462+
)
463+
commit_rows.append({
464+
"sha": sha,
465+
"msg": msg,
466+
"author": commit_login,
467+
"date": commit_date,
468+
"is_non_author_merge": is_non_author_merge,
469+
})
454470

455-
last_commit_date = parse_ts(commit_rows[-1]["date"]) if commit_rows else None
471+
# "Last commit pushed" is meant to surface real author activity, so
472+
# skip non-author merge commits (e.g. approvers clicking "Update
473+
# branch") when picking the timestamp.
474+
real_rows = [r for r in commit_rows if not r["is_non_author_merge"]]
475+
last_commit_date = parse_ts(real_rows[-1]["date"]) if real_rows else None
456476

457477
# Checks summary.
458478
failing = [c for c in checks if (c.get("state") or "").upper() in ("FAILURE", "ERROR")]
@@ -554,7 +574,8 @@ def render_context(ctx: dict[str, Any]) -> str:
554574
# Commits
555575
lines.append(f"Last {len(ctx['commits'])} commits (oldest first):")
556576
for c in ctx["commits"]:
557-
lines.append(f" {c['sha']} {c['date'][:10]} @{c['author']}: {truncate(c['msg'], 120)}")
577+
suffix = " [merge from base by non-author — not substantive activity]" if c.get("is_non_author_merge") else ""
578+
lines.append(f" {c['sha']} {c['date'][:10]} @{c['author']}: {truncate(c['msg'], 120)}{suffix}")
558579
lines.append("")
559580

560581
# Last substantive event highlight

0 commit comments

Comments
 (0)