Skip to content

Commit abd52f2

Browse files
committed
Revert "CLDSRV-838: Change startTime type to ms since epoch"
This reverts commit 294f26c.
1 parent a4f17bb commit abd52f2

File tree

3 files changed

+57
-4
lines changed

3 files changed

+57
-4
lines changed

lib/utilities/serverAccessLogger.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,15 @@ function calculateElapsedMS(startTime, onCloseEndTime) {
386386
return Number(onCloseEndTime - startTime) / 1_000_000;
387387
}
388388

389+
function timestampToDateTime643(unixMS) {
390+
if (unixMS === undefined || unixMS === null) {
391+
return null;
392+
}
393+
394+
// clickhouse DateTime64(3) expects "seconds.milliseconds" (string type).
395+
return (unixMS / 1000).toFixed(3);
396+
}
397+
389398
function logServerAccess(req, res) {
390399
if (!req.serverAccessLog || !res.serverAccessLog || !serverAccessLogger) {
391400
return;
@@ -420,7 +429,7 @@ function logServerAccess(req, res) {
420429
elapsed_ms: calculateElapsedMS(params.startTime, params.onCloseEndTime) ?? undefined,
421430
422431
// AWS access server logs fields https://docs.aws.amazon.com/AmazonS3/latest/userguide/LogFormat.html
423-
startTime: params.startTimeUnixMS ?? undefined, // AWS "Time" field - milliseconds since epoch
432+
startTime: timestampToDateTime643(params.startTimeUnixMS) ?? undefined, // AWS "Time" field
424433
requester: getRequester(authInfo) ?? undefined,
425434
operation: getOperation(req),
426435
requestURI: getURI(req) ?? undefined,
@@ -480,4 +489,5 @@ module.exports = {
480489
getBytesSent,
481490
calculateTotalTime,
482491
calculateTurnAroundTime,
492+
timestampToDateTime643,
483493
};

schema/server_access_log.schema.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@
6262
"minimum": 0
6363
},
6464
"startTime": {
65-
"description": "Milliseconds since Unix epoch, recorded when the server first routes the request. Represents the AWS server access log 'Time' field.",
66-
"type": "number"
65+
"description": "Timestamp formatted as: 'seconds.milliseconds', recorded when the server first routes the request. Represents the AWS server access log 'Time' field. String type compatible with Clickhouse DateTime64(3) type.",
66+
"type": "string"
6767
},
6868
"requester": {
6969
"description": "AWS server access log 'Requester' field. From AWS 'The canonical user ID of the requester, or a - for unauthenticated requests. If the requester was an IAM user, this field returns the requester's IAM user name along with the AWS account that the IAM user belongs to. This identifier is the same one used for access control purposes.'. We don't use null instead of '-' when the requester is missing.",

tests/unit/utils/serverAccessLogger.js

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const {
1111
getBytesSent,
1212
calculateTotalTime,
1313
calculateTurnAroundTime,
14+
timestampToDateTime643,
1415
} = require('../../../lib/utilities/serverAccessLogger');
1516

1617
describe('serverAccessLogger utility functions', () => {
@@ -679,6 +680,48 @@ describe('serverAccessLogger utility functions', () => {
679680
});
680681
});
681682

683+
describe('timestampToDateTime643', () => {
684+
it('should convert milliseconds to seconds with 3 decimal places', () => {
685+
const startTimeUnixMS = 1234567890000;
686+
const result = timestampToDateTime643(startTimeUnixMS);
687+
assert.strictEqual(result, '1234567890.000');
688+
});
689+
690+
it('should handle timestamp with milliseconds', () => {
691+
const startTimeUnixMS = 1234567890123;
692+
const result = timestampToDateTime643(startTimeUnixMS);
693+
assert.strictEqual(result, '1234567890.123');
694+
});
695+
696+
it('should handle 0', () => {
697+
const startTimeUnixMS = 0;
698+
const result = timestampToDateTime643(startTimeUnixMS);
699+
assert.strictEqual(result, '0.000');
700+
});
701+
702+
it('should return null when startTimeUnixMS is null', () => {
703+
const result = timestampToDateTime643(null);
704+
assert.strictEqual(result, null);
705+
});
706+
707+
it('should return null when startTimeUnixMS is undefined', () => {
708+
const result = timestampToDateTime643(undefined);
709+
assert.strictEqual(result, null);
710+
});
711+
712+
it('should handle small timestamps', () => {
713+
const startTimeUnixMS = 1000;
714+
const result = timestampToDateTime643(startTimeUnixMS);
715+
assert.strictEqual(result, '1.000');
716+
});
717+
718+
it('should handle timestamps with partial milliseconds', () => {
719+
const startTimeUnixMS = 1500;
720+
const result = timestampToDateTime643(startTimeUnixMS);
721+
assert.strictEqual(result, '1.500');
722+
});
723+
});
724+
682725
describe('logServerAccess', () => {
683726
let mockLogger;
684727
let sandbox;
@@ -831,7 +874,7 @@ describe('serverAccessLogger utility functions', () => {
831874
assert.strictEqual(loggedData.elapsed_ms, 20.5);
832875

833876
// Verify AWS access server log fields
834-
assert.strictEqual(loggedData.startTime, 1234567890000);
877+
assert.strictEqual(loggedData.startTime, '1234567890.000');
835878
assert.strictEqual(loggedData.requester, 'canonical123');
836879
assert.strictEqual(loggedData.operation, 'REST.GET.OBJECT');
837880
assert.strictEqual(loggedData.requestURI, 'GET /test-bucket/test-key.txt HTTP/1.1');

0 commit comments

Comments
 (0)