Skip to content

Commit 2d637a0

Browse files
committed
feat(node): Bump opentelemetry/instrumentation-pg to 0.51.0
1 parent 3c4df06 commit 2d637a0

File tree

6 files changed

+196
-26
lines changed

6 files changed

+196
-26
lines changed

dev-packages/node-integration-tests/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
"node-cron": "^3.0.3",
6464
"node-schedule": "^2.1.1",
6565
"pg": "^8.7.3",
66+
"pg-native": "^3.2.0",
6667
"proxy": "^2.1.1",
6768
"redis-4": "npm:redis@^4.6.14",
6869
"reflect-metadata": "0.2.1",
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
version: '3.9'
2+
3+
services:
4+
db:
5+
image: postgres:13
6+
restart: always
7+
container_name: integration-tests-postgres-native
8+
ports:
9+
- '5444:5432'
10+
environment:
11+
POSTGRES_USER: test
12+
POSTGRES_PASSWORD: test
13+
POSTGRES_DB: tests
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
const { loggingTransport } = require('@sentry-internal/node-integration-tests');
2+
const Sentry = require('@sentry/node');
3+
4+
Sentry.init({
5+
dsn: 'https://public@dsn.ingest.sentry.io/1337',
6+
release: '1.0',
7+
tracesSampleRate: 1.0,
8+
transport: loggingTransport,
9+
});
10+
11+
// Stop the process from exiting before the transaction is sent
12+
setInterval(() => {}, 1000);
13+
14+
const { native } = require('pg');
15+
const { Client } = native;
16+
17+
const client = new Client({ port: 5444, user: 'test', password: 'test', database: 'tests' });
18+
19+
async function run() {
20+
await Sentry.startSpan(
21+
{
22+
name: 'Test Transaction',
23+
op: 'transaction',
24+
},
25+
async () => {
26+
try {
27+
await client.connect();
28+
29+
await client
30+
.query(
31+
'CREATE TABLE "User" ("id" SERIAL NOT NULL,"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,"email" TEXT NOT NULL,"name" TEXT,CONSTRAINT "User_pkey" PRIMARY KEY ("id"));',
32+
)
33+
.catch(() => {
34+
// if this is not a fresh database, the table might already exist
35+
});
36+
37+
await client.query('INSERT INTO "User" ("email", "name") VALUES ($1, $2)', ['tim', 'tim@domain.com']);
38+
await client.query('SELECT * FROM "User"');
39+
} finally {
40+
await client.end();
41+
}
42+
},
43+
);
44+
}
45+
46+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
47+
run();
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { createRunner } from '../../../utils/runner';
2+
3+
// When running docker compose, we need a larger timeout, as this takes some time...
4+
jest.setTimeout(75_000);
5+
6+
describe('postgres native auto instrumentation', () => {
7+
test('should auto-instrument native bindings', done => {
8+
const EXPECTED_TRANSACTION = {
9+
transaction: 'Test Transaction',
10+
spans: expect.arrayContaining([
11+
expect.objectContaining({
12+
data: expect.objectContaining({
13+
'db.system': 'postgresql',
14+
'db.name': 'tests',
15+
'sentry.origin': 'manual',
16+
'sentry.op': 'db',
17+
}),
18+
description: 'pg.connect',
19+
op: 'db',
20+
status: 'ok',
21+
}),
22+
expect.objectContaining({
23+
data: expect.objectContaining({
24+
'db.system': 'postgresql',
25+
'db.name': 'tests',
26+
'db.statement': 'INSERT INTO "User" ("email", "name") VALUES ($1, $2)',
27+
'sentry.origin': 'auto.db.otel.postgres',
28+
'sentry.op': 'db',
29+
}),
30+
description: 'INSERT INTO "User" ("email", "name") VALUES ($1, $2)',
31+
op: 'db',
32+
status: 'ok',
33+
origin: 'auto.db.otel.postgres',
34+
}),
35+
expect.objectContaining({
36+
data: expect.objectContaining({
37+
'db.system': 'postgresql',
38+
'db.name': 'tests',
39+
'db.statement': 'SELECT * FROM "User"',
40+
'sentry.origin': 'auto.db.otel.postgres',
41+
'sentry.op': 'db',
42+
}),
43+
description: 'SELECT * FROM "User"',
44+
op: 'db',
45+
status: 'ok',
46+
origin: 'auto.db.otel.postgres',
47+
}),
48+
]),
49+
};
50+
51+
createRunner(__dirname, 'scenario.js')
52+
.withDockerCompose({ workingDirectory: [__dirname], readyMatches: ['port 5432']})
53+
.expect({ transaction: EXPECTED_TRANSACTION })
54+
.start(done);
55+
});
56+
});

packages/node/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@
8888
"@opentelemetry/instrumentation-mongoose": "0.46.0",
8989
"@opentelemetry/instrumentation-mysql": "0.45.0",
9090
"@opentelemetry/instrumentation-mysql2": "0.45.0",
91-
"@opentelemetry/instrumentation-pg": "0.50.0",
91+
"@opentelemetry/instrumentation-pg": "0.51.0",
9292
"@opentelemetry/instrumentation-redis-4": "0.46.0",
9393
"@opentelemetry/instrumentation-tedious": "0.18.0",
9494
"@opentelemetry/instrumentation-undici": "0.10.0",

yarn.lock

Lines changed: 78 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5801,14 +5801,14 @@
58015801
"@opentelemetry/instrumentation" "^0.57.0"
58025802
"@opentelemetry/semantic-conventions" "^1.27.0"
58035803

5804-
"@opentelemetry/instrumentation-pg@0.50.0":
5805-
version "0.50.0"
5806-
resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.50.0.tgz#525ecf683c349529539a14f2be47164f4e3eb0f5"
5807-
integrity sha512-TtLxDdYZmBhFswm8UIsrDjh/HFBeDXd4BLmE8h2MxirNHewLJ0VS9UUddKKEverb5Sm2qFVjqRjcU+8Iw4FJ3w==
5804+
"@opentelemetry/instrumentation-pg@0.51.0":
5805+
version "0.51.0"
5806+
resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.51.0.tgz#7d20016a32554ef66c008212dee3ff33fb1a587c"
5807+
integrity sha512-/NStIcUWUofc11dL7tSgMk25NqvhtbHDCncgm+yc4iJF8Ste2Q/lwUitjfxqj4qWM280uFmBEtcmtMMjbjRU7Q==
58085808
dependencies:
58095809
"@opentelemetry/core" "^1.26.0"
58105810
"@opentelemetry/instrumentation" "^0.57.0"
5811-
"@opentelemetry/semantic-conventions" "1.27.0"
5811+
"@opentelemetry/semantic-conventions" "^1.27.0"
58125812
"@opentelemetry/sql-common" "^0.40.1"
58135813
"@types/pg" "8.6.1"
58145814
"@types/pg-pool" "2.0.6"
@@ -5910,11 +5910,6 @@
59105910
"@opentelemetry/resources" "1.30.1"
59115911
"@opentelemetry/semantic-conventions" "1.28.0"
59125912

5913-
"@opentelemetry/semantic-conventions@1.27.0":
5914-
version "1.27.0"
5915-
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz#1a857dcc95a5ab30122e04417148211e6f945e6c"
5916-
integrity sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==
5917-
59185913
"@opentelemetry/semantic-conventions@1.28.0", "@opentelemetry/semantic-conventions@^1.25.1", "@opentelemetry/semantic-conventions@^1.27.0", "@opentelemetry/semantic-conventions@^1.28.0":
59195914
version "1.28.0"
59205915
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6"
@@ -10710,7 +10705,7 @@ binary@^0.3.0:
1071010705
resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.3.0.tgz#1d269cbf7e6243ea886aa41453c3651ccbe13c22"
1071110706
integrity sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==
1071210707

10713-
bindings@^1.4.0:
10708+
bindings@1.5.0, bindings@^1.4.0:
1071410709
version "1.5.0"
1071510710
resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
1071610711
integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
@@ -15620,11 +15615,6 @@ expect@^27.5.1:
1562015615
jest-matcher-utils "^27.5.1"
1562115616
jest-message-util "^27.5.1"
1562215617

15623-
exponential-backoff@^3.1.1:
15624-
version "3.1.1"
15625-
resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6"
15626-
integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==
15627-
1562815618
express@4.21.1, express@^4.10.7, express@^4.16.4, express@^4.17.1, express@^4.17.3, express@^4.18.1, express@^4.21.1:
1562915619
version "4.21.1"
1563015620
resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281"
@@ -19968,6 +19958,14 @@ libnpmpublish@7.3.0:
1996819958
sigstore "^1.4.0"
1996919959
ssri "^10.0.1"
1997019960

19961+
libpq@1.8.13:
19962+
version "1.8.13"
19963+
resolved "https://registry.yarnpkg.com/libpq/-/libpq-1.8.13.tgz#d48af53c88defa7a20f958ef51bbbc0f58747355"
19964+
integrity sha512-t1wpnGVgwRIFSKoe4RFUllAFj953kNMcdXhGvFJwI0r6lJQqgSwTeiIciaCinjOmHk0HnFeWQSMC6Uw2591G4A==
19965+
dependencies:
19966+
bindings "1.5.0"
19967+
nan "2.19.0"
19968+
1997119969
license-webpack-plugin@4.0.2:
1997219970
version "4.0.2"
1997319971
resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz#1e18442ed20b754b82f1adeff42249b81d11aec6"
@@ -20477,7 +20475,12 @@ lru-cache@6.0.0, lru-cache@^6.0.0:
2047720475
dependencies:
2047820476
yallist "^4.0.0"
2047920477

20480-
lru-cache@^10.2.0, lru-cache@^10.4.3:
20478+
lru-cache@^10.2.0:
20479+
version "10.2.2"
20480+
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878"
20481+
integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==
20482+
20483+
lru-cache@^10.4.3:
2048120484
version "10.4.3"
2048220485
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
2048320486
integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
@@ -21618,7 +21621,12 @@ minipass@^5.0.0:
2161821621
resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
2161921622
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
2162021623

21621-
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
21624+
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0":
21625+
version "7.0.3"
21626+
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974"
21627+
integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==
21628+
21629+
minipass@^7.1.2:
2162221630
version "7.1.2"
2162321631
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
2162421632
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
@@ -21968,6 +21976,11 @@ named-placeholders@^1.1.3:
2196821976
dependencies:
2196921977
lru-cache "^7.14.1"
2197021978

21979+
nan@2.19.0:
21980+
version "2.19.0"
21981+
resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0"
21982+
integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==
21983+
2197121984
nanoid@^3.3.3, nanoid@^3.3.4, nanoid@^3.3.6, nanoid@^3.3.7:
2197221985
version "3.3.7"
2197321986
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
@@ -22311,18 +22324,22 @@ node-forge@^1, node-forge@^1.3.1:
2231122324
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
2231222325
integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
2231322326

22314-
node-gyp-build@^4.2.2, node-gyp-build@^4.3.0:
22327+
node-gyp-build@^4.2.2:
2231522328
version "4.6.0"
2231622329
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055"
2231722330
integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==
2231822331

22332+
node-gyp-build@^4.3.0:
22333+
version "4.5.0"
22334+
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40"
22335+
integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==
22336+
2231922337
node-gyp@^9.0.0:
22320-
version "9.4.1"
22321-
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185"
22322-
integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==
22338+
version "9.3.0"
22339+
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.0.tgz#f8eefe77f0ad8edb3b3b898409b53e697642b319"
22340+
integrity sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==
2232322341
dependencies:
2232422342
env-paths "^2.2.0"
22325-
exponential-backoff "^3.1.1"
2232622343
glob "^7.1.4"
2232722344
graceful-fs "^4.2.6"
2232822345
make-fetch-happen "^10.0.3"
@@ -23797,6 +23814,14 @@ pg-int8@1.0.1:
2379723814
resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
2379823815
integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
2379923816

23817+
pg-native@^3.2.0:
23818+
version "3.2.0"
23819+
resolved "https://registry.yarnpkg.com/pg-native/-/pg-native-3.2.0.tgz#1183a549c00741040f1f47f9167a6bf378206826"
23820+
integrity sha512-9q9I6RmT285DiRc0xkYb8e+bwOIIbnfVLddnzzXW35K1sZc74dR+symo2oeuzSW/sDQ8n24gWAvlGWK/GDJ3+Q==
23821+
dependencies:
23822+
libpq "1.8.13"
23823+
pg-types "^1.12.1"
23824+
2380023825
pg-numeric@1.0.2:
2380123826
version "1.0.2"
2380223827
resolved "https://registry.yarnpkg.com/pg-numeric/-/pg-numeric-1.0.2.tgz#816d9a44026086ae8ae74839acd6a09b0636aa3a"
@@ -23812,6 +23837,17 @@ pg-protocol@*, pg-protocol@^1.5.0:
2381223837
resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.5.0.tgz#b5dd452257314565e2d54ab3c132adc46565a6a0"
2381323838
integrity sha512-muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==
2381423839

23840+
pg-types@^1.12.1:
23841+
version "1.13.0"
23842+
resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.13.0.tgz#75f490b8a8abf75f1386ef5ec4455ecf6b345c63"
23843+
integrity sha512-lfKli0Gkl/+za/+b6lzENajczwZHc7D5kiUCZfgm914jipD2kIOIvEkAhZ8GrW3/TUoP9w8FHjwpPObBye5KQQ==
23844+
dependencies:
23845+
pg-int8 "1.0.1"
23846+
postgres-array "~1.0.0"
23847+
postgres-bytea "~1.0.0"
23848+
postgres-date "~1.0.0"
23849+
postgres-interval "^1.1.0"
23850+
2381523851
pg-types@^2.1.0, pg-types@^2.2.0:
2381623852
version "2.2.0"
2381723853
resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
@@ -24608,6 +24644,11 @@ postcss@^8.1.10, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.3.7, postcss@^8.4.
2460824644
picocolors "^1.1.1"
2460924645
source-map-js "^1.2.1"
2461024646

24647+
postgres-array@~1.0.0:
24648+
version "1.0.3"
24649+
resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.3.tgz#c561fc3b266b21451fc6555384f4986d78ec80f5"
24650+
integrity sha512-5wClXrAP0+78mcsNX3/ithQ5exKvCyK5lr5NEEEeGwwM6NJdQgzIJBVxLvRW+huFpX92F2QnZ5CcokH0VhK2qQ==
24651+
2461124652
postgres-array@~2.0.0:
2461224653
version "2.0.0"
2461324654
resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
@@ -24630,7 +24671,7 @@ postgres-bytea@~3.0.0:
2463024671
dependencies:
2463124672
obuf "~1.1.2"
2463224673

24633-
postgres-date@~1.0.4:
24674+
postgres-date@~1.0.0, postgres-date@~1.0.4:
2463424675
version "1.0.7"
2463524676
resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8"
2463624677
integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==
@@ -27993,7 +28034,19 @@ tar@6.1.11:
2799328034
mkdirp "^1.0.3"
2799428035
yallist "^4.0.0"
2799528036

27996-
tar@^6.1.11, tar@^6.1.2, tar@^6.2.0:
28037+
tar@^6.1.11, tar@^6.1.2:
28038+
version "6.1.12"
28039+
resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.12.tgz#3b742fb05669b55671fb769ab67a7791ea1a62e6"
28040+
integrity sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==
28041+
dependencies:
28042+
chownr "^2.0.0"
28043+
fs-minipass "^2.0.0"
28044+
minipass "^3.0.0"
28045+
minizlib "^2.1.1"
28046+
mkdirp "^1.0.3"
28047+
yallist "^4.0.0"
28048+
28049+
tar@^6.2.0:
2799728050
version "6.2.1"
2799828051
resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
2799928052
integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==

0 commit comments

Comments
 (0)