@getmicdrop/svelte-components 2.0.4 → 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Alert/Alert.spec.js +170 -170
- package/dist/components/Badges/Badge.spec.js +103 -103
- package/dist/components/BottomSheet/BottomSheet.spec.js +127 -127
- package/dist/components/Breadcrumb/Breadcrumb.spec.js +120 -120
- package/dist/components/Button/Button.spec.js +211 -211
- package/dist/components/Button/ButtonSaveDemo.spec.js +48 -48
- package/dist/components/Calendar/Calendar.spec.js +131 -131
- package/dist/components/Calendar/QuarterView.spec.js +394 -394
- package/dist/components/Card.spec.js +47 -47
- package/dist/components/CropImage/CropImage.spec.js +216 -216
- package/dist/components/DarkModeToggle.spec.js +357 -357
- package/dist/components/ErrorDisplay.spec.js +69 -69
- package/dist/components/FormActions.spec.js +88 -88
- package/dist/components/FormValidationSummary.spec.js +203 -203
- package/dist/components/Icons/Icon.spec.js +175 -175
- package/dist/components/Icons/MoreHori.spec.js +67 -67
- package/dist/components/Icons/WarningIcon.spec.js +30 -30
- package/dist/components/Input/Input.spec.js +573 -573
- package/dist/components/Input/MultiSelect.spec.js +257 -257
- package/dist/components/Input/OTPInput.spec.js +238 -238
- package/dist/components/Input/Select.spec.js +218 -218
- package/dist/components/Layout/BottomNav.spec.js +130 -130
- package/dist/components/Layout/Header.spec.js +203 -203
- package/dist/components/Modal/ConfirmationModal.spec.js +191 -191
- package/dist/components/Modal/Modal.spec.js +95 -95
- package/dist/components/Modal/ModalStateManager.spec.js +100 -100
- package/dist/components/PageLoader.spec.js +54 -54
- package/dist/components/PasswordStrengthIndicator/PasswordStrengthIndicator.spec.js +173 -173
- package/dist/components/PlaceAutocomplete/PlaceAutocomplete.spec.js +300 -300
- package/dist/components/Spinner/Spinner.spec.js +75 -75
- package/dist/components/StatusIndicator/StatusIndicator.spec.js +129 -129
- package/dist/components/Toaster/Toaster.stories.svelte +1 -1
- package/dist/components/Toggle.spec.js +158 -158
- package/dist/components/ValidationError.spec.js +79 -79
- package/dist/components/pages/performers/AvailabilityCalendarModal.spec.js +606 -606
- package/dist/components/pages/performers/AvailabilityCalendarModal.svelte +4 -4
- package/dist/components/pages/performers/ModalShowInfo.spec.js +124 -124
- package/dist/components/pages/performers/ModalShowInfo.svelte +1 -1
- package/dist/components/pages/performers/PageBackButton.spec.js +89 -89
- package/dist/components/pages/performers/SectionHeader.spec.js +75 -75
- package/dist/components/pages/performers/ShowDetails.spec.js +166 -166
- package/dist/components/pages/performers/ShowItemCard.spec.js +793 -793
- package/dist/components/pages/performers/ShowItemCard.svelte +4 -4
- package/dist/components/pages/performers/SwitchOption.spec.js +127 -127
- package/dist/components/pages/performers/VenueInfo.spec.js +167 -167
- package/dist/components/pages/performers/VenueInfo.svelte +1 -1
- package/dist/components/pages/performers/VenueItemCard.spec.js +763 -763
- package/dist/components/pages/performers/VenueItemCard.svelte +4 -4
- package/dist/components/pages/profile/profile-form.spec.js +9 -9
- package/dist/components/pages/settings/tabs/CustomImageDropzone.svelte +3 -3
- package/dist/components/pages/shows/ShowList.spec.js +33 -33
- package/dist/components/pages/shows/TabContent.spec.js +90 -90
- package/dist/components/pages/shows/TabNavigation.spec.js +143 -143
- package/dist/config.js +5 -5
- package/dist/config.spec.js +29 -29
- package/dist/constants/formOptions.js +25 -25
- package/dist/constants/formOptions.spec.js +88 -88
- package/dist/index.js +111 -111
- package/dist/stores/auth.d.ts +9 -0
- package/dist/stores/auth.d.ts.map +1 -0
- package/dist/stores/auth.js +36 -0
- package/dist/stores/auth.spec.d.ts +2 -0
- package/dist/stores/auth.spec.d.ts.map +1 -0
- package/dist/stores/auth.spec.js +139 -0
- package/dist/stores/formDataStore.d.ts +17 -0
- package/dist/stores/formDataStore.d.ts.map +1 -0
- package/dist/stores/formDataStore.js +25 -0
- package/dist/stores/formDataStore.spec.d.ts +2 -0
- package/dist/stores/formDataStore.spec.d.ts.map +1 -0
- package/dist/stores/formDataStore.spec.js +257 -0
- package/dist/stores/formSave.d.ts +24 -0
- package/dist/stores/formSave.d.ts.map +1 -0
- package/dist/stores/formSave.js +132 -0
- package/dist/stores/formSave.spec.d.ts +2 -0
- package/dist/stores/formSave.spec.d.ts.map +1 -0
- package/dist/stores/formSave.spec.js +296 -0
- package/dist/stores/index.d.ts +1 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +0 -0
- package/dist/stores/navigation.d.ts +5 -0
- package/dist/stores/navigation.d.ts.map +1 -0
- package/dist/stores/navigation.js +12 -0
- package/dist/stores/navigation.spec.d.ts +2 -0
- package/dist/stores/navigation.spec.d.ts.map +1 -0
- package/dist/stores/navigation.spec.js +136 -0
- package/dist/stores/toaster.d.ts +4 -0
- package/dist/stores/toaster.d.ts.map +1 -0
- package/dist/stores/toaster.js +13 -0
- package/dist/stores/toaster.spec.d.ts +2 -0
- package/dist/stores/toaster.spec.d.ts.map +1 -0
- package/dist/stores/toaster.spec.js +59 -0
- package/dist/telemetry.js +357 -357
- package/dist/telemetry.server.js +211 -211
- package/dist/telemetry.server.spec.js +434 -434
- package/dist/telemetry.spec.js +660 -660
- package/dist/utils/apiConfig.js +49 -49
- package/dist/utils/apiConfig.spec.js +118 -118
- package/dist/utils/greetings.js +187 -187
- package/dist/utils/greetings.spec.js +337 -337
- package/dist/utils/imageValidation.js +121 -121
- package/dist/utils/imageValidation.spec.js +220 -220
- package/dist/utils/portal.js +25 -25
- package/dist/utils/portal.spec.js +143 -143
- package/dist/utils/utils/utils.js +323 -323
- package/dist/utils/utils/utils.spec.js +698 -698
- package/dist/utils/utils.spec.js +643 -643
- package/package.json +1 -1
package/dist/telemetry.server.js
CHANGED
|
@@ -1,212 +1,212 @@
|
|
|
1
|
-
// Server-side OpenTelemetry instrumentation for SvelteKit Performers Portal
|
|
2
|
-
import { registerInstrumentations } from '@opentelemetry/instrumentation';
|
|
3
|
-
import { NodeSDK } from '@opentelemetry/sdk-node';
|
|
4
|
-
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
5
|
-
import { Resource } from '@opentelemetry/resources';
|
|
6
|
-
import { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_VERSION, SEMRESATTRS_DEPLOYMENT_ENVIRONMENT } from '@opentelemetry/semantic-conventions';
|
|
7
|
-
import { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
|
|
8
|
-
import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch';
|
|
9
|
-
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
|
|
10
|
-
import { trace, context, propagation } from '@opentelemetry/api';
|
|
11
|
-
|
|
12
|
-
// Server telemetry configuration
|
|
13
|
-
const SERVER_TELEMETRY_CONFIG = {
|
|
14
|
-
serviceName: process.env.VITE_OTEL_SERVICE_NAME || 'jetbook-performersportal-ssr',
|
|
15
|
-
serviceVersion: process.env.VITE_OTEL_SERVICE_VERSION || '1.0.0',
|
|
16
|
-
environment: process.env.VITE_ENVIRONMENT || 'development',
|
|
17
|
-
otlpEndpoint: process.env.VITE_OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces',
|
|
18
|
-
tracesEnabled: process.env.VITE_OTEL_TRACES_ENABLED !== 'false',
|
|
19
|
-
sampleRate: parseFloat(process.env.VITE_OTEL_TRACES_SAMPLER_ARG || '0.1'),
|
|
20
|
-
consoleDebug: process.env.VITE_OTEL_DEBUG === 'true'
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
let sdk = null;
|
|
24
|
-
|
|
25
|
-
// Initialize server-side telemetry
|
|
26
|
-
export function initServerTelemetry() {
|
|
27
|
-
if (!SERVER_TELEMETRY_CONFIG.tracesEnabled) {
|
|
28
|
-
console.log('[Server Telemetry] Tracing is disabled');
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
sdk = new NodeSDK({
|
|
34
|
-
resource: new Resource({
|
|
35
|
-
[SEMRESATTRS_SERVICE_NAME]: SERVER_TELEMETRY_CONFIG.serviceName,
|
|
36
|
-
[SEMRESATTRS_SERVICE_VERSION]: SERVER_TELEMETRY_CONFIG.serviceVersion,
|
|
37
|
-
[SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: SERVER_TELEMETRY_CONFIG.environment,
|
|
38
|
-
'portal.type': 'performers'
|
|
39
|
-
}),
|
|
40
|
-
traceExporter: new OTLPTraceExporter({
|
|
41
|
-
url: SERVER_TELEMETRY_CONFIG.otlpEndpoint,
|
|
42
|
-
headers: {
|
|
43
|
-
'Content-Type': 'application/json'
|
|
44
|
-
}
|
|
45
|
-
}),
|
|
46
|
-
instrumentations: [
|
|
47
|
-
getNodeAutoInstrumentations({
|
|
48
|
-
'@opentelemetry/instrumentation-fs': {
|
|
49
|
-
enabled: false // Disable fs instrumentation as it's very noisy
|
|
50
|
-
}
|
|
51
|
-
}),
|
|
52
|
-
new HttpInstrumentation({
|
|
53
|
-
requestHook: (span, request) => {
|
|
54
|
-
span.setAttributes({
|
|
55
|
-
'http.route': request.url,
|
|
56
|
-
'http.user_agent': request.headers?.['user-agent'],
|
|
57
|
-
'http.referer': request.headers?.['referer'],
|
|
58
|
-
'ssr.type': 'request',
|
|
59
|
-
'portal.type': 'performers'
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
}),
|
|
63
|
-
new FetchInstrumentation({
|
|
64
|
-
propagateTraceHeaderCorsUrls: [
|
|
65
|
-
/^http:\/\/localhost:8080\/.*/,
|
|
66
|
-
/^https:\/\/api\.jetbook\.com\/.*/,
|
|
67
|
-
/^https:\/\/.*\.get-micdrop\.com\/.*/
|
|
68
|
-
]
|
|
69
|
-
})
|
|
70
|
-
]
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
sdk.start();
|
|
74
|
-
console.log(`[Server Telemetry] Initialized with ${SERVER_TELEMETRY_CONFIG.sampleRate * 100}% sampling rate`);
|
|
75
|
-
|
|
76
|
-
} catch (error) {
|
|
77
|
-
console.error('[Server Telemetry] Failed to initialize:', error);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Create spans for SSR page loads and data fetching
|
|
82
|
-
export function createSSRSpan(name, request, attributes = {}) {
|
|
83
|
-
const tracer = trace.getTracer(
|
|
84
|
-
SERVER_TELEMETRY_CONFIG.serviceName,
|
|
85
|
-
SERVER_TELEMETRY_CONFIG.serviceVersion
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
return tracer.startSpan(name, {
|
|
89
|
-
attributes: {
|
|
90
|
-
'span.kind': 'server',
|
|
91
|
-
'ssr.type': 'page_load',
|
|
92
|
-
'portal.type': 'performers',
|
|
93
|
-
'http.method': request?.method || 'GET',
|
|
94
|
-
'http.url': request?.url,
|
|
95
|
-
'http.user_agent': request?.headers?.['user-agent'],
|
|
96
|
-
'http.referer': request?.headers?.['referer'],
|
|
97
|
-
...attributes
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Track SSR data loading for performers
|
|
103
|
-
export function trackPerformerSSRDataLoad(loadFunction, context) {
|
|
104
|
-
return async (event) => {
|
|
105
|
-
const span = createSSRSpan(`ssr.performer.load.${context}`, event.request, {
|
|
106
|
-
'ssr.context': context,
|
|
107
|
-
'route.id': event.route?.id,
|
|
108
|
-
'performer.context': true
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
try {
|
|
112
|
-
const result = await loadFunction(event);
|
|
113
|
-
span.setStatus({ code: 1 }); // OK
|
|
114
|
-
|
|
115
|
-
// Add performer-specific attributes if available
|
|
116
|
-
if (result?.performer) {
|
|
117
|
-
span.setAttributes({
|
|
118
|
-
'performer.id': result.performer.id,
|
|
119
|
-
'performer.name': result.performer.name,
|
|
120
|
-
'performer.email': result.performer.email
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
return result;
|
|
125
|
-
} catch (error) {
|
|
126
|
-
span.recordException(error);
|
|
127
|
-
span.setStatus({ code: 2, message: error.message }); // ERROR
|
|
128
|
-
throw error;
|
|
129
|
-
} finally {
|
|
130
|
-
span.end();
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Extract trace context from request headers (for connecting client and server spans)
|
|
136
|
-
export function extractTraceContext(request) {
|
|
137
|
-
const headers = {};
|
|
138
|
-
if (request?.headers) {
|
|
139
|
-
// Convert Headers object to plain object
|
|
140
|
-
for (const [key, value] of request.headers.entries()) {
|
|
141
|
-
headers[key] = value;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return propagation.extract(context.active(), headers);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Inject trace context into response headers (for client-side correlation)
|
|
148
|
-
export function injectTraceContext(response, span) {
|
|
149
|
-
const headers = {};
|
|
150
|
-
propagation.inject(context.active(), headers);
|
|
151
|
-
|
|
152
|
-
// Add trace context headers to response
|
|
153
|
-
Object.entries(headers).forEach(([key, value]) => {
|
|
154
|
-
response.headers?.set(key, value);
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
// Add trace ID for client correlation
|
|
158
|
-
const spanContext = span?.spanContext();
|
|
159
|
-
if (spanContext) {
|
|
160
|
-
response.headers?.set('X-Trace-Id', spanContext.traceId);
|
|
161
|
-
response.headers?.set('X-Span-Id', spanContext.spanId);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
return response;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Shutdown server telemetry
|
|
168
|
-
export async function shutdownServerTelemetry() {
|
|
169
|
-
if (sdk) {
|
|
170
|
-
try {
|
|
171
|
-
await sdk.shutdown();
|
|
172
|
-
console.log('[Server Telemetry] Shutdown complete');
|
|
173
|
-
} catch (error) {
|
|
174
|
-
console.error('[Server Telemetry] Shutdown error:', error);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// SvelteKit-specific helpers for performers portal
|
|
180
|
-
export const performersPortalTelemetry = {
|
|
181
|
-
// Wrap page load functions
|
|
182
|
-
wrapLoad: (loadFn, context) => trackPerformerSSRDataLoad(loadFn, context),
|
|
183
|
-
|
|
184
|
-
// Wrap performer actions
|
|
185
|
-
wrapAction: (actionFn, actionName) => {
|
|
186
|
-
return async (event) => {
|
|
187
|
-
const span = createSSRSpan(`ssr.performer.action.${actionName}`, event.request, {
|
|
188
|
-
'ssr.context': 'action',
|
|
189
|
-
'action.name': actionName,
|
|
190
|
-
'performer.context': true
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
try {
|
|
194
|
-
const result = await actionFn(event);
|
|
195
|
-
span.setStatus({ code: 1 }); // OK
|
|
196
|
-
return result;
|
|
197
|
-
} catch (error) {
|
|
198
|
-
span.recordException(error);
|
|
199
|
-
span.setStatus({ code: 2, message: error.message }); // ERROR
|
|
200
|
-
throw error;
|
|
201
|
-
} finally {
|
|
202
|
-
span.end();
|
|
203
|
-
}
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
// Auto-initialize if in server environment
|
|
209
|
-
if (typeof window === 'undefined' && typeof global !== 'undefined') {
|
|
210
|
-
// Server environment
|
|
211
|
-
initServerTelemetry();
|
|
1
|
+
// Server-side OpenTelemetry instrumentation for SvelteKit Performers Portal
|
|
2
|
+
import { registerInstrumentations } from '@opentelemetry/instrumentation';
|
|
3
|
+
import { NodeSDK } from '@opentelemetry/sdk-node';
|
|
4
|
+
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
|
|
5
|
+
import { Resource } from '@opentelemetry/resources';
|
|
6
|
+
import { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_VERSION, SEMRESATTRS_DEPLOYMENT_ENVIRONMENT } from '@opentelemetry/semantic-conventions';
|
|
7
|
+
import { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
|
|
8
|
+
import { FetchInstrumentation } from '@opentelemetry/instrumentation-fetch';
|
|
9
|
+
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
|
|
10
|
+
import { trace, context, propagation } from '@opentelemetry/api';
|
|
11
|
+
|
|
12
|
+
// Server telemetry configuration
|
|
13
|
+
const SERVER_TELEMETRY_CONFIG = {
|
|
14
|
+
serviceName: process.env.VITE_OTEL_SERVICE_NAME || 'jetbook-performersportal-ssr',
|
|
15
|
+
serviceVersion: process.env.VITE_OTEL_SERVICE_VERSION || '1.0.0',
|
|
16
|
+
environment: process.env.VITE_ENVIRONMENT || 'development',
|
|
17
|
+
otlpEndpoint: process.env.VITE_OTEL_EXPORTER_OTLP_ENDPOINT || 'http://localhost:4318/v1/traces',
|
|
18
|
+
tracesEnabled: process.env.VITE_OTEL_TRACES_ENABLED !== 'false',
|
|
19
|
+
sampleRate: parseFloat(process.env.VITE_OTEL_TRACES_SAMPLER_ARG || '0.1'),
|
|
20
|
+
consoleDebug: process.env.VITE_OTEL_DEBUG === 'true'
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
let sdk = null;
|
|
24
|
+
|
|
25
|
+
// Initialize server-side telemetry
|
|
26
|
+
export function initServerTelemetry() {
|
|
27
|
+
if (!SERVER_TELEMETRY_CONFIG.tracesEnabled) {
|
|
28
|
+
console.log('[Server Telemetry] Tracing is disabled');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
sdk = new NodeSDK({
|
|
34
|
+
resource: new Resource({
|
|
35
|
+
[SEMRESATTRS_SERVICE_NAME]: SERVER_TELEMETRY_CONFIG.serviceName,
|
|
36
|
+
[SEMRESATTRS_SERVICE_VERSION]: SERVER_TELEMETRY_CONFIG.serviceVersion,
|
|
37
|
+
[SEMRESATTRS_DEPLOYMENT_ENVIRONMENT]: SERVER_TELEMETRY_CONFIG.environment,
|
|
38
|
+
'portal.type': 'performers'
|
|
39
|
+
}),
|
|
40
|
+
traceExporter: new OTLPTraceExporter({
|
|
41
|
+
url: SERVER_TELEMETRY_CONFIG.otlpEndpoint,
|
|
42
|
+
headers: {
|
|
43
|
+
'Content-Type': 'application/json'
|
|
44
|
+
}
|
|
45
|
+
}),
|
|
46
|
+
instrumentations: [
|
|
47
|
+
getNodeAutoInstrumentations({
|
|
48
|
+
'@opentelemetry/instrumentation-fs': {
|
|
49
|
+
enabled: false // Disable fs instrumentation as it's very noisy
|
|
50
|
+
}
|
|
51
|
+
}),
|
|
52
|
+
new HttpInstrumentation({
|
|
53
|
+
requestHook: (span, request) => {
|
|
54
|
+
span.setAttributes({
|
|
55
|
+
'http.route': request.url,
|
|
56
|
+
'http.user_agent': request.headers?.['user-agent'],
|
|
57
|
+
'http.referer': request.headers?.['referer'],
|
|
58
|
+
'ssr.type': 'request',
|
|
59
|
+
'portal.type': 'performers'
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}),
|
|
63
|
+
new FetchInstrumentation({
|
|
64
|
+
propagateTraceHeaderCorsUrls: [
|
|
65
|
+
/^http:\/\/localhost:8080\/.*/,
|
|
66
|
+
/^https:\/\/api\.jetbook\.com\/.*/,
|
|
67
|
+
/^https:\/\/.*\.get-micdrop\.com\/.*/
|
|
68
|
+
]
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
sdk.start();
|
|
74
|
+
console.log(`[Server Telemetry] Initialized with ${SERVER_TELEMETRY_CONFIG.sampleRate * 100}% sampling rate`);
|
|
75
|
+
|
|
76
|
+
} catch (error) {
|
|
77
|
+
console.error('[Server Telemetry] Failed to initialize:', error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Create spans for SSR page loads and data fetching
|
|
82
|
+
export function createSSRSpan(name, request, attributes = {}) {
|
|
83
|
+
const tracer = trace.getTracer(
|
|
84
|
+
SERVER_TELEMETRY_CONFIG.serviceName,
|
|
85
|
+
SERVER_TELEMETRY_CONFIG.serviceVersion
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
return tracer.startSpan(name, {
|
|
89
|
+
attributes: {
|
|
90
|
+
'span.kind': 'server',
|
|
91
|
+
'ssr.type': 'page_load',
|
|
92
|
+
'portal.type': 'performers',
|
|
93
|
+
'http.method': request?.method || 'GET',
|
|
94
|
+
'http.url': request?.url,
|
|
95
|
+
'http.user_agent': request?.headers?.['user-agent'],
|
|
96
|
+
'http.referer': request?.headers?.['referer'],
|
|
97
|
+
...attributes
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Track SSR data loading for performers
|
|
103
|
+
export function trackPerformerSSRDataLoad(loadFunction, context) {
|
|
104
|
+
return async (event) => {
|
|
105
|
+
const span = createSSRSpan(`ssr.performer.load.${context}`, event.request, {
|
|
106
|
+
'ssr.context': context,
|
|
107
|
+
'route.id': event.route?.id,
|
|
108
|
+
'performer.context': true
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
const result = await loadFunction(event);
|
|
113
|
+
span.setStatus({ code: 1 }); // OK
|
|
114
|
+
|
|
115
|
+
// Add performer-specific attributes if available
|
|
116
|
+
if (result?.performer) {
|
|
117
|
+
span.setAttributes({
|
|
118
|
+
'performer.id': result.performer.id,
|
|
119
|
+
'performer.name': result.performer.name,
|
|
120
|
+
'performer.email': result.performer.email
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return result;
|
|
125
|
+
} catch (error) {
|
|
126
|
+
span.recordException(error);
|
|
127
|
+
span.setStatus({ code: 2, message: error.message }); // ERROR
|
|
128
|
+
throw error;
|
|
129
|
+
} finally {
|
|
130
|
+
span.end();
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Extract trace context from request headers (for connecting client and server spans)
|
|
136
|
+
export function extractTraceContext(request) {
|
|
137
|
+
const headers = {};
|
|
138
|
+
if (request?.headers) {
|
|
139
|
+
// Convert Headers object to plain object
|
|
140
|
+
for (const [key, value] of request.headers.entries()) {
|
|
141
|
+
headers[key] = value;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return propagation.extract(context.active(), headers);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Inject trace context into response headers (for client-side correlation)
|
|
148
|
+
export function injectTraceContext(response, span) {
|
|
149
|
+
const headers = {};
|
|
150
|
+
propagation.inject(context.active(), headers);
|
|
151
|
+
|
|
152
|
+
// Add trace context headers to response
|
|
153
|
+
Object.entries(headers).forEach(([key, value]) => {
|
|
154
|
+
response.headers?.set(key, value);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// Add trace ID for client correlation
|
|
158
|
+
const spanContext = span?.spanContext();
|
|
159
|
+
if (spanContext) {
|
|
160
|
+
response.headers?.set('X-Trace-Id', spanContext.traceId);
|
|
161
|
+
response.headers?.set('X-Span-Id', spanContext.spanId);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return response;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Shutdown server telemetry
|
|
168
|
+
export async function shutdownServerTelemetry() {
|
|
169
|
+
if (sdk) {
|
|
170
|
+
try {
|
|
171
|
+
await sdk.shutdown();
|
|
172
|
+
console.log('[Server Telemetry] Shutdown complete');
|
|
173
|
+
} catch (error) {
|
|
174
|
+
console.error('[Server Telemetry] Shutdown error:', error);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// SvelteKit-specific helpers for performers portal
|
|
180
|
+
export const performersPortalTelemetry = {
|
|
181
|
+
// Wrap page load functions
|
|
182
|
+
wrapLoad: (loadFn, context) => trackPerformerSSRDataLoad(loadFn, context),
|
|
183
|
+
|
|
184
|
+
// Wrap performer actions
|
|
185
|
+
wrapAction: (actionFn, actionName) => {
|
|
186
|
+
return async (event) => {
|
|
187
|
+
const span = createSSRSpan(`ssr.performer.action.${actionName}`, event.request, {
|
|
188
|
+
'ssr.context': 'action',
|
|
189
|
+
'action.name': actionName,
|
|
190
|
+
'performer.context': true
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
try {
|
|
194
|
+
const result = await actionFn(event);
|
|
195
|
+
span.setStatus({ code: 1 }); // OK
|
|
196
|
+
return result;
|
|
197
|
+
} catch (error) {
|
|
198
|
+
span.recordException(error);
|
|
199
|
+
span.setStatus({ code: 2, message: error.message }); // ERROR
|
|
200
|
+
throw error;
|
|
201
|
+
} finally {
|
|
202
|
+
span.end();
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
// Auto-initialize if in server environment
|
|
209
|
+
if (typeof window === 'undefined' && typeof global !== 'undefined') {
|
|
210
|
+
// Server environment
|
|
211
|
+
initServerTelemetry();
|
|
212
212
|
}
|