Skip to content

Commit 6f1f0d9

Browse files
committed
Refactor check-package-names.sh to validate both library and javaagent source sets
Extracts a check_source_set function and runs it for both library and javaagent source roots. Previously only library/ was validated. This adds enforcement for javaagent module/package naming and produces explicit allow-lists for the historical exceptions and the no-base-version common modules.
1 parent e9c3259 commit 6f1f0d9

1 file changed

Lines changed: 163 additions & 58 deletions

File tree

Lines changed: 163 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,175 @@
11
#!/bin/bash -e
22

3-
for dir in $(find instrumentation -name "*.java" | grep library/src/main/java | sed 's#/[^/]*$##' | sort -u); do
3+
if command -v rg > /dev/null 2>&1; then
4+
case "$(uname -s)" in
5+
CYGWIN* | MINGW* | MSYS*) path_separator="//" ;;
6+
*) path_separator="/" ;;
7+
esac
48

5-
module_name=$(echo "$dir" | sed 's#.*/\([^/]*\)/library/src/main/java[0-9]*/.*#\1#')
9+
source_dirs=$(rg --files --path-separator "$path_separator" instrumentation -g '*.java' \
10+
| grep -E '/(library|javaagent)/src/main/java[0-9]*/' \
11+
| sed 's#/[^/]*$##' \
12+
| sort -u)
13+
else
14+
source_dirs=$(find instrumentation \( -path "*/library/src/main/java*/*.java" -o -path "*/javaagent/src/main/java*/*.java" \) -print \
15+
| sed 's#/[^/]*$##' \
16+
| sort -u)
17+
fi
618

7-
if [[ "$module_name" =~ ^java- ]]; then
8-
continue
9-
fi
10-
if [[ "$module_name" == "jmx-metrics" ]]; then
11-
continue
12-
fi
13-
if [[ "$module_name" == "runtime-telemetry" ]]; then
14-
continue
15-
fi
16-
if [[ "$module_name" == "servlet-common" ]]; then
17-
continue
18-
fi
19-
if [[ "$module_name" == "graphql-java-common-12.0" ]]; then
20-
continue
21-
fi
19+
check_source_set() {
20+
local source_set="$1"
21+
local expected_prefix="$2"
2222

23-
# these are possibly problematic
24-
if [[ "$dir" == "instrumentation/grpc-1.6/library/src/main/java/io/grpc/override" ]]; then
25-
continue
26-
fi
27-
if [[ "$dir" == "instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/lettuce/core/protocol" ]]; then
28-
continue
29-
fi
30-
if [[ "$dir" == "instrumentation/nats/nats-2.17/library/src/main/java/io/nats/client/impl" ]]; then
31-
continue
32-
fi
33-
if [[ "$dir" == "instrumentation/rxjava/rxjava-1.0/library/src/main/java/rx" ]]; then
34-
continue
35-
fi
23+
while IFS= read -r dir; do
24+
if [[ "$dir" != *"/$source_set/src/main/java"* ]]; then
25+
continue
26+
fi
3627

37-
# some common modules don't have any base version (might have a variant instead, ex: javax)
38-
# - jdbc
39-
# - lettuce-common
40-
# - netty-common
41-
# - oshi
42-
# - resources
43-
# - servlet-common-javax
44-
if [[ ! "$module_name" =~ [0-9]$ && "$module_name" != "jdbc" && "$module_name" != "lettuce-common" && "$module_name" != "netty-common" && "$module_name" != "oshi" && "$module_name" != "resources" && "$module_name" != "servlet-common-javax" ]]; then
45-
echo "module name doesn't have a base version: $dir"
46-
exit 1
47-
fi
28+
module_path=${dir%%/$source_set/src/main/java*}
29+
module_name=${module_path##*/}
4830

49-
# convention: if module ends with -java (followed by version), remove -java from the package name
50-
simple_module_name=$(echo "$module_name" | sed 's/-[0-9.]*$//' | sed 's/-java$//' | sed 's/-//g')
51-
base_version=$(echo "$module_name" | sed 's/.*-\([0-9.]*\)$/\1/' | sed 's/\./_/g')
31+
if [[ "$module_name" =~ ^java- ]]; then
32+
continue
33+
fi
34+
if [[ "$module_name" == "jmx-metrics" ]]; then
35+
continue
36+
fi
37+
# these are possibly problematic
38+
if [[ "$source_set" == "library" ]]; then
39+
if [[ "$dir" == "instrumentation/grpc-1.6/library/src/main/java/io/grpc/override" ]]; then
40+
continue
41+
fi
42+
if [[ "$dir" == "instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/lettuce/core/protocol" ]]; then
43+
continue
44+
fi
45+
if [[ "$dir" == "instrumentation/nats/nats-2.17/library/src/main/java/io/nats/client/impl" ]]; then
46+
continue
47+
fi
48+
if [[ "$dir" == "instrumentation/rxjava/rxjava-1.0/library/src/main/java/rx" ]]; then
49+
continue
50+
fi
51+
if [[ "$dir" == "instrumentation/servlet/servlet-common/library/src/main/java/io/opentelemetry/instrumentation/servlet/internal" ]]; then
52+
continue
53+
fi
54+
fi
5255

53-
if [[ "$module_name" =~ [0-9]$ ]]; then
54-
expected_package_name="io/opentelemetry/instrumentation/$simple_module_name/v$base_version"
55-
else
56-
expected_package_name="io/opentelemetry/instrumentation/$simple_module_name"
57-
fi
56+
if [[ "$source_set" == "javaagent" ]]; then
57+
# advice packages that must live under the instrumented library's own namespace
58+
case "$dir" in
59+
instrumentation/clickhouse/clickhouse-client-v1-0.5/javaagent/src/main/java/com/clickhouse/client*) continue ;;
60+
instrumentation/finagle-http-23.11/javaagent/src/main/java/com/twitter/finagle*) continue ;;
61+
instrumentation/finagle-http-23.11/javaagent/src/main/java/io/netty/channel*) continue ;;
62+
instrumentation/reactor/reactor-netty/reactor-netty-1.0/javaagent/src/main/java/reactor/netty/http/client*) continue ;;
63+
instrumentation/spring/spring-webmvc/spring-webmvc-3.1/javaagent/src/main/java/org/springframework/web/servlet/v3_1*) continue ;;
64+
instrumentation/spring/spring-webmvc/spring-webmvc-6.0/javaagent/src/main/java/org/springframework/web/servlet/v6_0*) continue ;;
65+
instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/main/java/io/vertx/redis/client/impl*) continue ;;
66+
instrumentation/vertx/vertx-sql-client/vertx-sql-client-common-4.0/javaagent/src/main/java/io/vertx/sqlclient/impl*) continue ;;
67+
esac
5868

59-
package_name=$(echo "$dir" | sed 's#.*/src/main/java[0-9]*/##')
69+
# historical javaagent modules that do not follow the module-name <-> package-name convention
70+
case "$dir" in
71+
instrumentation/akka/akka-actor-fork-join-2.5/javaagent/*) continue ;;
72+
instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11) continue ;;
73+
instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal) continue ;;
74+
instrumentation/internal/internal-application-logger/javaagent/*) continue ;;
75+
instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-annotations/javaagent/*) continue ;;
76+
instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/javaagent/*) continue ;;
77+
instrumentation/jaxrs/jaxrs-3.0/jaxrs-3.0-annotations/javaagent/*) continue ;;
78+
instrumentation/jaxrs/jaxrs-3.0/jaxrs-3.0-common/javaagent/*) continue ;;
79+
instrumentation/jaxrs/jaxrs-common/javaagent/*) continue ;;
80+
instrumentation/opentelemetry-api/opentelemetry-api-1.0/javaagent/*) continue ;;
81+
instrumentation/opentelemetry-extension-annotations-1.0/javaagent/*) continue ;;
82+
instrumentation/opentelemetry-instrumentation-annotations-1.16/javaagent/*) continue ;;
83+
instrumentation/opentelemetry-instrumentation-api/javaagent/*) continue ;;
84+
instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet) continue ;;
85+
instrumentation/servlet/servlet-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/snippet) continue ;;
86+
instrumentation/spring/spring-boot-resources/javaagent/*) continue ;;
87+
esac
88+
fi
6089

61-
# deal with differences like module name elasticsearch-rest and package name elasticsearch.rest
62-
expected_package_name_normalized=$(echo "$expected_package_name" | sed 's#/##g')
63-
package_name_normalized=$(echo "$package_name" | sed 's#/##g')
90+
# some common modules don't have any base version (might have a variant instead, ex: javax)
91+
if [[ ! "$module_name" =~ [0-9]$ ]]; then
92+
case "$source_set:$module_name" in
93+
# library:
94+
library:jdbc) ;;
95+
library:lettuce-common) ;;
96+
library:netty-common) ;;
97+
library:oshi) ;;
98+
library:resources) ;;
99+
library:runtime-telemetry) ;;
100+
library:servlet-common) ;;
101+
library:servlet-common-javax) ;;
102+
# javaagent:
103+
javaagent:elasticsearch-transport-common) ;;
104+
javaagent:executors) ;;
105+
javaagent:external-annotations) ;;
106+
javaagent:http-url-connection) ;;
107+
javaagent:internal-application-logger) ;;
108+
javaagent:internal-class-loader) ;;
109+
javaagent:internal-lambda) ;;
110+
javaagent:internal-reflection) ;;
111+
javaagent:internal-url-class-loader) ;;
112+
javaagent:jaxrs-common) ;;
113+
javaagent:jdbc) ;;
114+
javaagent:jetty-common) ;;
115+
javaagent:jsf-common-jakarta) ;;
116+
javaagent:jsf-common-javax) ;;
117+
javaagent:methods) ;;
118+
javaagent:opensearch-rest-common) ;;
119+
javaagent:opentelemetry-instrumentation-api) ;;
120+
javaagent:oshi) ;;
121+
javaagent:payara) ;;
122+
javaagent:quarkus-resteasy-reactive) ;;
123+
javaagent:rmi) ;;
124+
javaagent:runtime-telemetry) ;;
125+
javaagent:servlet-common) ;;
126+
javaagent:spring-boot-resources) ;;
127+
javaagent:spring-cloud-gateway-common) ;;
128+
javaagent:spring-webmvc-common) ;;
129+
javaagent:tomcat-common) ;;
130+
javaagent:tomcat-jdbc) ;;
131+
*)
132+
echo "module name doesn't have a base version: $dir"
133+
exit 1
134+
;;
135+
esac
136+
fi
64137

65-
if [[ "$package_name_normalized" != "$expected_package_name_normalized"* ]]; then
66-
echo "ERROR: $dir"
67-
exit 1
68-
fi
138+
# build expected package name by walking the module name's dash-separated tokens:
139+
# a version token (e.g. "3.0") becomes "/v3_0", any other token becomes "/<token>";
140+
# the literal token "java" is elided (e.g. graphql-java-20.0 -> graphql/v20_0).
141+
# this also handles multi-version modules like jaxrs-2.0-resteasy-3.1 -> jaxrs/v2_0/resteasy/v3_1.
142+
expected_package_name="$expected_prefix"
143+
IFS='-' read -ra module_parts <<< "$module_name"
144+
for part in "${module_parts[@]}"; do
145+
if [[ "$part" == "java" ]]; then
146+
continue
147+
fi
148+
if [[ "$part" =~ ^[0-9][0-9.]*$ ]]; then
149+
expected_package_name="$expected_package_name/v${part//./_}"
150+
else
151+
expected_package_name="$expected_package_name/$part"
152+
fi
153+
done
69154

70-
done
155+
if [[ "$dir" =~ /src/main/java[0-9]*/(.*)$ ]]; then
156+
package_name=${BASH_REMATCH[1]}
157+
else
158+
echo "ERROR: $dir"
159+
exit 1
160+
fi
161+
162+
# deal with differences like module name elasticsearch-rest and package name elasticsearch.rest
163+
expected_package_name_normalized=${expected_package_name//\//}
164+
package_name_normalized=${package_name//\//}
165+
166+
if [[ "$package_name_normalized" != "$expected_package_name_normalized"* ]]; then
167+
echo "ERROR: $dir"
168+
exit 1
169+
fi
170+
171+
done <<< "$source_dirs"
172+
}
173+
174+
check_source_set "library" "io/opentelemetry/instrumentation"
175+
check_source_set "javaagent" "io/opentelemetry/javaagent/instrumentation"

0 commit comments

Comments
 (0)