Skip to content

Commit c3fd71f

Browse files
committed
Simplify worker code; Don't compress metrics
1 parent 8c65bab commit c3fd71f

File tree

4 files changed

+36
-85
lines changed

4 files changed

+36
-85
lines changed

bin/worker.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import { reportMetric } from "../lib/influx.js";
22

3-
export const handleRequest = async (request, env) => {
4-
const url = new URL(request.url);
5-
const newRequest = new Request(`${env.REQUEST_URL}${url.pathname}${url.search}`, request);
6-
7-
return await fetch(newRequest);
8-
}
9-
103
export default {
114
async fetch(request, env, ctx) {
12-
const response = await handleRequest(request, env);
13-
ctx.waitUntil(reportMetric(request, response, env));
5+
const response = await fetch(request);
6+
ctx.waitUntil(
7+
caches.default.put(request, response.clone())
8+
)
9+
ctx.waitUntil(
10+
reportMetric(request, response.headers, env)
11+
);
1412
return response;
1513
}
1614
}

lib/influx.js

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,35 @@
1-
import zlib from 'node:zlib';
2-
import { promisify } from 'node:util';
3-
41
/*
5-
* Sends compressed request metrics to InfluxDB
2+
* Sends request metrics to InfluxDB
63
* https://docs.influxdata.com/enterprise_influxdb/v1/guides/write_data/
74
*/
8-
export const reportMetric = async (request, response, env) => {
9-
const compress = promisify(zlib.gzip);
10-
5+
export const reportMetric = async (request, env) => {
116
// Define API endpoint and headers
127
const url = `${env.INFLUX_URL}/api/v2/write?&bucket=${env.INFLUX_DATABASE}&precision=ms`;
138

14-
return fetch(url, {
9+
await fetch(url, {
1510
method: 'POST',
1611
headers: {
1712
'Authorization': `Token ${env.INFLUX_TOKEN}`,
18-
'Content-Encoding': 'gzip',
19-
'Content-Type': 'text/plain; charset=utf-8',
13+
'Content-Type': 'application/octet-stream'
2014
},
21-
body: await compress(createMetricsFromRequest(request, response, env)),
15+
body: createMetricsFromRequest(request, env),
2216
})
2317
}
2418

2519
/*
2620
* Returns request metrics in InfluxDB line protocol format
2721
* https://docs.influxdata.com/influxdb/cloud/reference/syntax/line-protocol/
2822
*/
29-
export const createMetricsFromRequest = (request, response = {}, env) => {
23+
export const createMetricsFromRequest = (request, env) => {
3024
const url = new URL(request.url);
3125
const timestamp = Date.now();
32-
const apiKey = request.headers.get('api-key') ||
26+
const apiKey = request.headers.get('api-key') ||
3327
url.searchParams.get('api-key') || (
34-
request.headers.get('Authorization')?.startsWith('Bearer ')
35-
? request.headers.get('Authorization').substring(7)
36-
: 'unknown'
28+
request.headers.get('Authorization')?.startsWith('Bearer ')
29+
? request.headers.get('Authorization').substring(7)
30+
: 'unknown'
3731
);
38-
const cfCacheStatus = response?.headers.get('CF-Cache-Status') ?? 'miss'
39-
const formattedUrl = url.toString().replaceAll('=', '\\=');
4032

4133
// We're setting field value to 1 to count the number of requests
42-
return `${env.INFLUX_METRIC_NAME},status_code=${response.status},url=${formattedUrl},hostname=${url.hostname},pathname="${url.pathname}",method=${request.method},cf_cache_status=${cfCacheStatus},api_key=${apiKey} value=1 ${timestamp}`
34+
return `${env.INFLUX_METRIC_NAME},api_key="${apiKey}" value=1 ${timestamp}`
4335
}

test/influx.test.js

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,7 @@ describe('reportMetric', () => {
1111
['Authorization', 'Bearer test-token']
1212
])
1313
};
14-
const response = {
15-
status: 200,
16-
headers: new Map([
17-
['CF-Cache-Status', 'HIT']
18-
])
19-
};
14+
2015
const env = {
2116
INFLUX_METRIC_NAME: 'test_metric',
2217
INFLUX_URL: 'https://influx.example.com',
@@ -26,16 +21,15 @@ describe('reportMetric', () => {
2621

2722
global.fetch = vi.fn().mockResolvedValue({ status: 204 });
2823

29-
await reportMetric(request, response, env);
24+
await reportMetric(request, env);
3025

3126
expect(global.fetch).toHaveBeenCalledWith(
3227
'https://influx.example.com/api/v2/write?&bucket=test_db&precision=ms',
3328
expect.objectContaining({
3429
method: 'POST',
3530
headers: expect.objectContaining({
3631
'Authorization': 'Token test_token',
37-
'Content-Encoding': 'gzip',
38-
'Content-Type': 'text/plain; charset=utf-8'
32+
'Content-Type': 'application/octet-stream'
3933
})
4034
})
4135
);
@@ -52,24 +46,13 @@ describe('createMetricsFromRequest', () => {
5246
['Authorization', 'Bearer test-token']
5347
])
5448
};
55-
const response = {
56-
status: 200,
57-
headers: new Map([
58-
['CF-Cache-Status', 'HIT']
59-
])
60-
};
49+
6150
const env = {
6251
INFLUX_METRIC_NAME: 'test_metric'
6352
};
6453

65-
const result = createMetricsFromRequest(request, response, env);
54+
const result = createMetricsFromRequest(request, env);
6655
expect(result).toContain('test_metric');
67-
expect(result).toContain('status_code=200');
68-
expect(result).toContain('url=https://example.com/path?api-key\\=test-key');
69-
expect(result).toContain('hostname=example.com');
70-
expect(result).toContain('pathname="/path"');
71-
expect(result).toContain('method=GET');
72-
expect(result).toContain('cf_cache_status=HIT');
73-
expect(result).toContain('api_key=test-key');
56+
expect(result).toContain('api_key="test-key"');
7457
});
7558
});

test/worker.test.js

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,32 @@
11
import { describe, it, expect, vi } from 'vitest';
2-
import worker, { handleRequest } from '../bin/worker.js';
2+
import worker from '../bin/worker.js';
33
import { reportMetric } from '../lib/influx.js';
44

5-
describe('handleRequest', () => {
6-
it('should handle request correctly', async () => {
5+
6+
7+
describe('worker.fetch', () => {
8+
it('should fetch and report metrics correctly', async () => {
79
const request = {
810
url: 'https://example.com/path?api-key=test-key',
911
method: 'GET'
1012
};
1113
const env = {
1214
REQUEST_URL: 'https://proxy.example.com'
1315
};
16+
const ctx = {
17+
waitUntil: vi.fn()
18+
};
1419

15-
global.fetch = vi.fn().mockResolvedValue({ status: 200 });
16-
17-
const response = await handleRequest(request, env);
20+
global.fetch = vi.fn().mockResolvedValue(new Response(null, { status: 200 }));
21+
const response = await worker.fetch(request, env, ctx);
1822

1923
expect(global.fetch).toHaveBeenCalledWith(
2024
expect.objectContaining({
21-
url: 'https://proxy.example.com/path?api-key=test-key',
25+
url: 'https://example.com/path?api-key=test-key',
2226
method: 'GET'
2327
})
2428
);
29+
expect(ctx.waitUntil).toHaveBeenCalledWith(reportMetric(request, response, env));
2530
expect(response.status).toBe(200);
2631
});
27-
28-
describe('worker.fetch', () => {
29-
it('should fetch and report metrics correctly', async () => {
30-
const request = {
31-
url: 'https://example.com/path?api-key=test-key',
32-
method: 'GET'
33-
};
34-
const env = {
35-
REQUEST_URL: 'https://proxy.example.com'
36-
};
37-
const ctx = {
38-
waitUntil: vi.fn()
39-
};
40-
41-
global.fetch = vi.fn().mockResolvedValue({ status: 200 });
42-
const response = await worker.fetch(request, env, ctx);
43-
44-
expect(global.fetch).toHaveBeenCalledWith(
45-
expect.objectContaining({
46-
url: 'https://proxy.example.com/path?api-key=test-key',
47-
method: 'GET'
48-
})
49-
);
50-
expect(ctx.waitUntil).toHaveBeenCalledWith(reportMetric(request, response, env));
51-
expect(response.status).toBe(200);
52-
});
53-
});
5432
});

0 commit comments

Comments
 (0)