1+ /**
2+ * @import { Signal, UploadOptions } from './upload/upload.d.ts'
3+ */
4+
15/**
26 * Resolve collector options from CLI args and environment.
37 *
610 *
711 * @param {string[] } argv CLI arguments (without node/script name).
812 * @param {NodeJS.ProcessEnv } env Environment variables.
9- * @returns {{ port?: number, outputDir?: string } } Options for Collector.
13+ * @returns {{ port?: number, outputDir?: string, upload?: UploadOptions } } Options for Collector.
1014 */
1115export function resolveOptions ( argv , env ) {
12- /** @type {{ port?: number, outputDir?: string } } */
16+ /** @type {{ port?: number, outputDir?: string, upload?: UploadOptions } } */
1317 const options = { }
18+ /** @type {Partial<UploadOptions> } */
19+ const upload = { }
1420
1521 if ( env . COLLECTIVUS_PORT ) {
1622 const port = parseInt ( env . COLLECTIVUS_PORT , 10 )
@@ -20,22 +26,82 @@ export function resolveOptions(argv, env) {
2026 options . outputDir = env . COLLECTIVUS_OUTPUT_DIR
2127 }
2228
29+ if ( env . COLLECTIVUS_UPLOAD_BUCKET ) upload . bucket = env . COLLECTIVUS_UPLOAD_BUCKET
30+ if ( env . COLLECTIVUS_UPLOAD_PREFIX ) upload . prefix = env . COLLECTIVUS_UPLOAD_PREFIX
31+ if ( env . COLLECTIVUS_UPLOAD_TIME ) upload . time = env . COLLECTIVUS_UPLOAD_TIME
32+ if ( env . COLLECTIVUS_UPLOAD_SIGNALS ) upload . signals = parseSignals ( env . COLLECTIVUS_UPLOAD_SIGNALS )
33+ if ( env . COLLECTIVUS_UPLOAD_CATCHUP_DAYS ) {
34+ const n = parseInt ( env . COLLECTIVUS_UPLOAD_CATCHUP_DAYS , 10 )
35+ if ( ! Number . isNaN ( n ) ) upload . catchupDays = n
36+ }
37+ if ( env . AWS_REGION ) upload . region = env . AWS_REGION
38+ if ( env . COLLECTIVUS_UPLOAD_ENDPOINT ) upload . endpoint = env . COLLECTIVUS_UPLOAD_ENDPOINT
39+
2340 for ( let i = 0 ; i < argv . length ; i ++ ) {
2441 const arg = argv [ i ]
25- if ( arg === '--port' && argv [ i + 1 ] ) {
26- const port = parseInt ( argv [ i + 1 ] , 10 )
42+ function next ( ) { return argv [ ++ i ] }
43+ if ( arg === '--port' && argv [ i + 1 ] !== undefined ) {
44+ const port = parseInt ( next ( ) , 10 )
2745 if ( ! Number . isNaN ( port ) ) options . port = port
28- i ++
2946 } else if ( arg . startsWith ( '--port=' ) ) {
3047 const port = parseInt ( arg . slice ( '--port=' . length ) , 10 )
3148 if ( ! Number . isNaN ( port ) ) options . port = port
32- } else if ( arg === '--output' && argv [ i + 1 ] ) {
33- options . outputDir = argv [ i + 1 ]
34- i ++
49+ } else if ( arg === '--output' && argv [ i + 1 ] !== undefined ) {
50+ options . outputDir = next ( )
3551 } else if ( arg . startsWith ( '--output=' ) ) {
3652 options . outputDir = arg . slice ( '--output=' . length )
53+ } else if ( arg === '--upload-bucket' && argv [ i + 1 ] !== undefined ) {
54+ upload . bucket = next ( )
55+ } else if ( arg . startsWith ( '--upload-bucket=' ) ) {
56+ upload . bucket = arg . slice ( '--upload-bucket=' . length )
57+ } else if ( arg === '--upload-prefix' && argv [ i + 1 ] !== undefined ) {
58+ upload . prefix = next ( )
59+ } else if ( arg . startsWith ( '--upload-prefix=' ) ) {
60+ upload . prefix = arg . slice ( '--upload-prefix=' . length )
61+ } else if ( arg === '--upload-time' && argv [ i + 1 ] !== undefined ) {
62+ upload . time = next ( )
63+ } else if ( arg . startsWith ( '--upload-time=' ) ) {
64+ upload . time = arg . slice ( '--upload-time=' . length )
65+ } else if ( arg === '--upload-signals' && argv [ i + 1 ] !== undefined ) {
66+ upload . signals = parseSignals ( next ( ) )
67+ } else if ( arg . startsWith ( '--upload-signals=' ) ) {
68+ upload . signals = parseSignals ( arg . slice ( '--upload-signals=' . length ) )
69+ } else if ( arg === '--upload-catchup-days' && argv [ i + 1 ] !== undefined ) {
70+ const n = parseInt ( next ( ) , 10 )
71+ if ( ! Number . isNaN ( n ) ) upload . catchupDays = n
72+ } else if ( arg . startsWith ( '--upload-catchup-days=' ) ) {
73+ const n = parseInt ( arg . slice ( '--upload-catchup-days=' . length ) , 10 )
74+ if ( ! Number . isNaN ( n ) ) upload . catchupDays = n
75+ } else if ( arg === '--upload-region' && argv [ i + 1 ] !== undefined ) {
76+ upload . region = next ( )
77+ } else if ( arg . startsWith ( '--upload-region=' ) ) {
78+ upload . region = arg . slice ( '--upload-region=' . length )
79+ } else if ( arg === '--upload-endpoint' && argv [ i + 1 ] !== undefined ) {
80+ upload . endpoint = next ( )
81+ } else if ( arg . startsWith ( '--upload-endpoint=' ) ) {
82+ upload . endpoint = arg . slice ( '--upload-endpoint=' . length )
3783 }
3884 }
3985
86+ if ( upload . bucket ) {
87+ options . upload = /** @type {UploadOptions } */ ( upload )
88+ }
89+
4090 return options
4191}
92+
93+ /**
94+ * @param {string } value comma-separated signal list
95+ * @returns {ReadonlyArray<Signal> }
96+ */
97+ function parseSignals ( value ) {
98+ /** @type {Signal[] } */
99+ const out = [ ]
100+ for ( const part of value . split ( ',' ) ) {
101+ const trimmed = part . trim ( )
102+ if ( trimmed === 'logs' || trimmed === 'traces' || trimmed === 'metrics' ) {
103+ out . push ( trimmed )
104+ }
105+ }
106+ return out
107+ }
0 commit comments