Skip to content

Commit

Permalink
start instrumenting sql connections and queries
Browse files Browse the repository at this point in the history
  • Loading branch information
tantaman committed Aug 9, 2022
1 parent 98d67b0 commit 2dc9e77
Show file tree
Hide file tree
Showing 19 changed files with 806 additions and 2,786 deletions.
7 changes: 6 additions & 1 deletion NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,9 @@ Solidjs architecture: https://www.youtube.com/watch?v=_ne2BsvFBH0, https://www.y
# Dep Tracking

How might we have Model properties integrated into SolidJS's reactivity system?
Live queries too.
Live queries too.


# Signoz:

http://localhost:3301/application
3 changes: 2 additions & 1 deletion build-all/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
{ "path": "../extensions/mutation-grammar" },
{ "path": "../extensions/graphql-grammar" },
{ "path": "../extensions/graphql-codegen" },
{ "path": "../packages/wa-sqlite-connector" }
{ "path": "../packages/wa-sqlite-connector" },
{ "path": "../packages/instrument" }
]
}
14 changes: 14 additions & 0 deletions jaeger.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-e COLLECTOR_OTLP_ENABLED=true \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 4317:4317 \
-p 4318:4318 \
-p 14250:14250 \
-p 14268:14268 \
-p 14269:14269 \
-p 9411:9411 \
jaegertracing/all-in-one:1.37
2 changes: 2 additions & 0 deletions packages/absurd-sql-connector/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
"@aphro/absurd-sql": "^0.0.53",
"@aphro/context-runtime-ts": "workspace:*",
"@aphro/sql-ts": "workspace:*",
"@aphro/instrument": "workspace:*",
"@aphro/sql.js": "^1.7.0",
"@opentelemetry/api": "^1.1.0",
"@strut/counter": "^0.0.11"
},
"devDependencies": {
Expand Down
61 changes: 33 additions & 28 deletions packages/absurd-sql-connector/src/main/connection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import count from '@strut/counter';
import thisPackage from '../pkg.js';
import { initBackend } from '@aphro/absurd-sql/dist/indexeddb-main-thread.js';
import { formatters, SQLQuery } from '@aphro/sql-ts';
import tracer from '../tracer.js';
import { SpanStatusCode } from '@opentelemetry/api';

let queryId = 0;

Expand Down Expand Up @@ -51,37 +53,40 @@ export default class Connection {
this.#worker.addEventListener('message', setReady);
});

this.#worker.addEventListener('message', this.#messageListener);
}

// TODO: what type gets returned?
async query(sql: SQLQuery): Promise<any> {
counter.bump('query');
const id = queryId++;

let resolvePending;
let rejectPending;
const promise = new Promise((resolve, reject) => {
resolvePending = resolve;
rejectPending = reject;
});

this.#pending.push({
id,
resolve: resolvePending,
reject: rejectPending,
this.#worker.addEventListener('message', m => {
tracer.startActiveSpan('connection.receive-message', () => this.#messageListener(m));
});
}

const formatted = sql.format(formatters['sqlite']);

this.#worker.postMessage({
pkg: thisPackage,
event: 'query',
queryObj: { sql: formatted.text, bindings: formatted.values },
id,
query(sql: SQLQuery): Promise<any> {
return tracer.genStartActiveSpan('connection.query', () => {
counter.bump('query');
const id = queryId++;

let resolvePending;
let rejectPending;
const promise = new Promise((resolve, reject) => {
resolvePending = resolve;
rejectPending = reject;
});

this.#pending.push({
id,
resolve: resolvePending,
reject: rejectPending,
});

const formatted = sql.format(formatters['sqlite']);

this.#worker.postMessage({
pkg: thisPackage,
event: 'query',
queryObj: { sql: formatted.text, bindings: formatted.values },
id,
});

return promise;
});

return await promise;
}

#messageListener = ({ data }) => {
Expand Down
5 changes: 5 additions & 0 deletions packages/absurd-sql-connector/src/tracer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { tracer } from '@aphro/instrument';

tracer.configure('@aphro/absurd-sql-connector', '0.2.1');

export default tracer;
105 changes: 55 additions & 50 deletions packages/absurd-sql-connector/src/worker/worker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import initSqlJs from '@aphro/sql.js';
import { SQLiteFS } from '@aphro/absurd-sql';
import IndexedDBBackend from '@aphro/absurd-sql/dist/indexeddb-backend.js';
import thisPackage from '../pkg.js';
import tracer from '../tracer.js';

/**
* This is the entrypoint for our web-worker.
Expand Down Expand Up @@ -29,71 +30,75 @@ async function init() {
PRAGMA journal_mode=MEMORY;
`);

self.addEventListener('message', async function ({ data }) {
const { pkg, event, id, queryObj } = data;
if (pkg !== thisPackage) {
return;
}
if (event !== 'query') {
return;
}
self.addEventListener('message', ({ data }) => {
tracer.startActiveSpan('worker.receive-message', () => receiveMessage(db, data));
});

// console.log(queryObj);
if (queryObj.bindings) {
let stmt;
let rows: any[] = [];
try {
stmt = db.prepare(queryObj.sql);
stmt.bind(queryObj.bindings);
while (stmt.step()) rows.push(stmt.getAsObject());
} catch (e) {
self.postMessage({
pkg: thisPackage,
event: 'query-response',
id,
error: {
message: e.message,
},
});
return;
} finally {
if (stmt != null) {
stmt.free();
}
}
self.postMessage({
pkg: thisPackage,
event: 'ready',
});
}

function receiveMessage(db, data) {
const { pkg, event, id, queryObj } = data;
if (pkg !== thisPackage) {
return;
}
if (event !== 'query') {
return;
}

// console.log(queryObj);
if (queryObj.bindings) {
let stmt;
let rows: any[] = [];
try {
stmt = db.prepare(queryObj.sql);
stmt.bind(queryObj.bindings);
while (stmt.step()) rows.push(stmt.getAsObject());
} catch (e) {
self.postMessage({
pkg: thisPackage,
event: 'query-response',
id,
result: rows,
error: {
message: e.message,
},
});
} else {
try {
db.exec(queryObj.sql);
} catch (e) {
self.postMessage({
pkg: thisPackage,
event: 'query-response',
id,
error: e,
});
return;
return;
} finally {
if (stmt != null) {
stmt.free();
}
}

self.postMessage({
pkg: thisPackage,
event: 'query-response',
id,
result: rows,
});
} else {
try {
db.exec(queryObj.sql);
} catch (e) {
self.postMessage({
pkg: thisPackage,
event: 'query-response',
id,
result: [],
error: e,
});
return;
}
});

self.postMessage({
pkg: thisPackage,
event: 'ready',
});
self.postMessage({
pkg: thisPackage,
event: 'query-response',
id,
result: [],
});
}
}

init();
await tracer.genStartActiveSpan('worker.init', init);
6 changes: 5 additions & 1 deletion packages/absurd-sql-connector/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,9 @@
"rootDir": "./src"
},
"include": ["./src/"],
"references": [{ "path": "../sql-ts" }, { "path": "../context-runtime-ts" }]
"references": [
{ "path": "../sql-ts" },
{ "path": "../context-runtime-ts" },
{ "path": "../instrument" }
]
}
1 change: 1 addition & 0 deletions packages/instrument/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lib/
3 changes: 3 additions & 0 deletions packages/instrument/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# instrument

Helper functions to trace and measure program execution.
34 changes: 34 additions & 0 deletions packages/instrument/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"name": "@aphro/instrument",
"version": "0.0.1",
"main": "lib/index.js",
"type": "module",
"repository": {
"type": "git",
"url": "https://github.com/tantaman/aphrodite.git",
"directory": "packages/instrument"
},
"dependencies": {
"@opentelemetry/api": "^1.1.0"
},
"devDependencies": {
"@babel/core": "^7.17.12",
"@babel/preset-env": "^7.17.12",
"@types/jest": "^27.4.1",
"jest": "^28.1.0",
"ts-jest": "^28.0.1",
"typescript": "^4.6.4"
},
"scripts": {
"clean": "tsc --build --clean",
"build": "tsc --build",
"watch": "tsc --build -w",
"test": "node ./node_modules/jest/bin/jest.js",
"deep-clean": "rm -rf ./lib || true && rm tsconfig.tsbuildinfo || true"
},
"jest": {
"testMatch": [
"**/__tests__/**/*.test.js"
]
}
}
1 change: 1 addition & 0 deletions packages/instrument/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default as tracer } from './tracer.js';
67 changes: 67 additions & 0 deletions packages/instrument/src/tracer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { SpanStatusCode, trace, Tracer } from '@opentelemetry/api';

let tracer: Tracer;

export default {
configure(pkg: string, version: string) {
tracer = trace.getTracer(pkg, version);
},

get tracer() {
return tracer;
},

startSpan(name: string) {
return tracer.startSpan(name);
},

startActiveSpan<T>(name: string, cb: () => T): T {
return tracer.startActiveSpan(name, span => {
try {
return cb();
} catch (e) {
span.recordException(e);
throw e;
} finally {
span.end();
}
});
},

genStartActiveSpan<T>(name: string, cb: () => Promise<T>): Promise<T> {
return tracer.startActiveSpan(name, async span => {
try {
return await cb();
} catch (e) {
span.recordException(e);
throw e;
} finally {
span.end();
}
});
},

async genSpan<T>(name: string, cb: () => Promise<T>): Promise<T> {
const span = tracer.startSpan(name);
try {
return await cb();
} catch (e) {
span.recordException(e);
throw e;
} finally {
span.end();
}
},

span<T>(name: string, cb: () => T): T {
const span = tracer.startSpan(name);
try {
return cb();
} catch (e) {
span.recordException(e);
throw e;
} finally {
span.end();
}
},
};
9 changes: 9 additions & 0 deletions packages/instrument/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"extends": "../../tsconfig-templates/lib.json",
"compilerOptions": {
"outDir": "./lib/",
"rootDir": "./src"
},
"include": ["./src/"],
"references": []
}
Loading

0 comments on commit 2dc9e77

Please sign in to comment.