@uploadista/observability 0.0.3 → 0.0.4

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.
Files changed (91) hide show
  1. package/.turbo/turbo-build.log +19 -2
  2. package/dist/index.cjs +1 -0
  3. package/dist/index.d.cts +736 -0
  4. package/dist/index.d.cts.map +1 -0
  5. package/dist/index.d.ts +735 -7
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -14
  8. package/dist/index.js.map +1 -0
  9. package/package.json +4 -3
  10. package/tsdown.config.ts +11 -0
  11. package/dist/core/errors.d.ts +0 -8
  12. package/dist/core/errors.d.ts.map +0 -1
  13. package/dist/core/errors.js +0 -108
  14. package/dist/core/index.d.ts +0 -8
  15. package/dist/core/index.d.ts.map +0 -1
  16. package/dist/core/index.js +0 -8
  17. package/dist/core/layers.d.ts +0 -104
  18. package/dist/core/layers.d.ts.map +0 -1
  19. package/dist/core/layers.js +0 -110
  20. package/dist/core/logging.d.ts +0 -18
  21. package/dist/core/logging.d.ts.map +0 -1
  22. package/dist/core/logging.js +0 -41
  23. package/dist/core/metrics.d.ts +0 -37
  24. package/dist/core/metrics.d.ts.map +0 -1
  25. package/dist/core/metrics.js +0 -72
  26. package/dist/core/testing.d.ts +0 -43
  27. package/dist/core/testing.d.ts.map +0 -1
  28. package/dist/core/testing.js +0 -93
  29. package/dist/core/tracing.d.ts +0 -19
  30. package/dist/core/tracing.d.ts.map +0 -1
  31. package/dist/core/tracing.js +0 -43
  32. package/dist/core/utilities.d.ts +0 -11
  33. package/dist/core/utilities.d.ts.map +0 -1
  34. package/dist/core/utilities.js +0 -41
  35. package/dist/flow/errors.d.ts +0 -15
  36. package/dist/flow/errors.d.ts.map +0 -1
  37. package/dist/flow/errors.js +0 -66
  38. package/dist/flow/index.d.ts +0 -6
  39. package/dist/flow/index.d.ts.map +0 -1
  40. package/dist/flow/index.js +0 -6
  41. package/dist/flow/layers.d.ts +0 -40
  42. package/dist/flow/layers.d.ts.map +0 -1
  43. package/dist/flow/layers.js +0 -94
  44. package/dist/flow/metrics.d.ts +0 -52
  45. package/dist/flow/metrics.d.ts.map +0 -1
  46. package/dist/flow/metrics.js +0 -89
  47. package/dist/flow/testing.d.ts +0 -11
  48. package/dist/flow/testing.d.ts.map +0 -1
  49. package/dist/flow/testing.js +0 -27
  50. package/dist/flow/tracing.d.ts +0 -35
  51. package/dist/flow/tracing.d.ts.map +0 -1
  52. package/dist/flow/tracing.js +0 -42
  53. package/dist/service/metrics.d.ts +0 -23
  54. package/dist/service/metrics.d.ts.map +0 -1
  55. package/dist/service/metrics.js +0 -17
  56. package/dist/storage/azure.d.ts +0 -47
  57. package/dist/storage/azure.d.ts.map +0 -1
  58. package/dist/storage/azure.js +0 -89
  59. package/dist/storage/filesystem.d.ts +0 -47
  60. package/dist/storage/filesystem.d.ts.map +0 -1
  61. package/dist/storage/filesystem.js +0 -70
  62. package/dist/storage/gcs.d.ts +0 -47
  63. package/dist/storage/gcs.d.ts.map +0 -1
  64. package/dist/storage/gcs.js +0 -90
  65. package/dist/storage/index.d.ts +0 -5
  66. package/dist/storage/index.d.ts.map +0 -1
  67. package/dist/storage/index.js +0 -5
  68. package/dist/storage/s3.d.ts +0 -47
  69. package/dist/storage/s3.d.ts.map +0 -1
  70. package/dist/storage/s3.js +0 -67
  71. package/dist/test-observability.d.ts +0 -12
  72. package/dist/test-observability.d.ts.map +0 -1
  73. package/dist/test-observability.js +0 -153
  74. package/dist/upload/errors.d.ts +0 -16
  75. package/dist/upload/errors.d.ts.map +0 -1
  76. package/dist/upload/errors.js +0 -107
  77. package/dist/upload/index.d.ts +0 -6
  78. package/dist/upload/index.d.ts.map +0 -1
  79. package/dist/upload/index.js +0 -6
  80. package/dist/upload/layers.d.ts +0 -32
  81. package/dist/upload/layers.d.ts.map +0 -1
  82. package/dist/upload/layers.js +0 -63
  83. package/dist/upload/metrics.d.ts +0 -46
  84. package/dist/upload/metrics.d.ts.map +0 -1
  85. package/dist/upload/metrics.js +0 -80
  86. package/dist/upload/testing.d.ts +0 -32
  87. package/dist/upload/testing.d.ts.map +0 -1
  88. package/dist/upload/testing.js +0 -52
  89. package/dist/upload/tracing.d.ts +0 -25
  90. package/dist/upload/tracing.d.ts.map +0 -1
  91. package/dist/upload/tracing.js +0 -35
@@ -1,5 +1,22 @@
1
1
 
2
2
  
3
- > @uploadista/observability@0.0.2 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/observability
4
- > tsc -b
3
+ > @uploadista/observability@0.0.3 build /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/observability
4
+ > tsdown
5
5
 
6
+ ℹ tsdown v0.15.9 powered by rolldown v1.0.0-beta.44
7
+ ℹ Using tsdown config: /Users/denislaboureyras/Documents/uploadista/dev/uploadista-workspace/uploadista-sdk/packages/observability/tsdown.config.ts
8
+ ℹ entry: src/index.ts
9
+ ℹ tsconfig: tsconfig.json
10
+ ℹ Build start
11
+ ℹ Cleaning 7 files
12
+ ℹ [CJS] dist/index.cjs 32.37 kB │ gzip: 7.54 kB
13
+ ℹ [CJS] 1 files, total: 32.37 kB
14
+ ℹ [ESM] dist/index.js  29.34 kB │ gzip: 7.24 kB
15
+ ℹ [ESM] dist/index.js.map 100.17 kB │ gzip: 18.02 kB
16
+ ℹ [ESM] dist/index.d.ts.map  11.86 kB │ gzip: 3.02 kB
17
+ ℹ [ESM] dist/index.d.ts  46.85 kB │ gzip: 5.31 kB
18
+ ℹ [ESM] 4 files, total: 188.22 kB
19
+ ℹ [CJS] dist/index.d.cts.map 11.87 kB │ gzip: 3.02 kB
20
+ ℹ [CJS] dist/index.d.cts 46.85 kB │ gzip: 5.31 kB
21
+ ℹ [CJS] 2 files, total: 58.72 kB
22
+ ✔ Build complete in 2634ms
package/dist/index.cjs ADDED
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`effect`);c=s(c);let l=require(`@effect/opentelemetry`);l=s(l);let u=require(`@opentelemetry/sdk-trace-base`);u=s(u);const d=e=>{if(!e||typeof e!=`object`)return`unknown_error`;let t=`code`in e?e.code:void 0,n=`name`in e?e.name:void 0,r=e instanceof Error?e.message.toLowerCase():``;return t===`NetworkError`||t===`ECONNRESET`||t===`ENOTFOUND`||t===`ETIMEDOUT`||r.indexOf(`network`)>=0||r.indexOf(`timeout`)>=0?`network_error`:t===`InvalidAccessKeyId`||t===`SignatureDoesNotMatch`||t===`TokenRefreshRequired`||t===`AuthenticationFailed`||n===`AuthenticationError`||r.indexOf(`authentication`)>=0||r.indexOf(`unauthorized`)>=0?`authentication_error`:t===`AccessDenied`||t===`AccountProblem`||t===`Forbidden`||n===`AuthorizationError`||r.indexOf(`forbidden`)>=0||r.indexOf(`permission`)>=0?`authorization_error`:t===`SlowDown`||t===`RequestTimeTooSkewed`||t===`TooManyRequests`||n===`ThrottlingError`||r.indexOf(`throttl`)>=0||r.indexOf(`rate limit`)>=0?`throttling_error`:t===`InternalError`||t===`ServiceUnavailable`||t===`InternalServerError`||n===`ServerError`||r.indexOf(`server error`)>=0||r.indexOf(`service unavailable`)>=0?`server_error`:t===`InvalidRequest`||t===`MalformedXML`||t===`RequestEntityTooLarge`||t===`BadRequest`||n===`ClientError`||r.indexOf(`bad request`)>=0||r.indexOf(`invalid`)>=0?`client_error`:`unknown_error`},ee=(e,t)=>e=>{if(t){let n=t(e);if(n!==null)return n}return d(e)},te=(e,t,n,r,i={},a=d)=>c.Effect.gen(function*(){let o=a(r);yield*t.uploadErrorsTotal.pipe(c.Metric.tagged(`operation`,n),c.Metric.tagged(`error_category`,o))(c.Effect.succeed(1));let s={storage_type:e,operation:n,error_category:o,error_type:typeof r,error_message:r instanceof Error?r.message:String(r),error_code:r&&typeof r==`object`&&`code`in r?r.code:void 0,error_name:r&&typeof r==`object`&&`name`in r?r.name:void 0,...i};yield*c.Effect.logError(`${e.toUpperCase()} ${n} failed`).pipe(c.Effect.annotateLogs(s))}),f=(e,t,n)=>{let r=ee(e,n);return(n,i,a={})=>te(e,t,n,i,a,r)};var p=class extends c.Context.Tag(`Observability`)(){},m=class extends c.Context.Tag(`StorageObservability`)(){},h=class extends c.Context.Tag(`UploadObservability`)(){},g=class extends c.Context.Tag(`FlowObservability`)(){};const ne=(e,t=!0)=>c.Layer.succeed(p,{serviceName:e,enabled:t}),re=(e,t,n=!0)=>c.Layer.succeed(m,{serviceName:`uploadista-${e}-store`,storageType:e,metrics:t,enabled:n}),_=(e=!0)=>c.Layer.succeed(h,{serviceName:`uploadista-upload-server`,enabled:e,metrics:{uploadCreated:c.Effect.void,uploadCompleted:c.Effect.void,uploadFailed:c.Effect.void,chunkUploaded:c.Effect.void}}),v=(e=!0)=>c.Layer.succeed(g,{serviceName:`uploadista-flow-engine`,enabled:e,metrics:{flowStarted:c.Effect.void,flowCompleted:c.Effect.void,flowFailed:c.Effect.void,nodeExecuted:c.Effect.void}}),ie=ne(`uploadista-disabled`,!1),ae=e=>re(e,{},!1),oe=_(!1),se=v(!1),y=c.Effect.gen(function*(){let e=yield*c.Effect.serviceOption(p);return c.Option.match(e,{onNone:()=>!1,onSome:e=>e.enabled})}),ce=e=>c.Effect.gen(function*(){if(yield*y){let t=yield*e;return c.Option.some(t)}return c.Option.none()}),b=(e,t)=>c.Effect.log(e).pipe(c.Effect.annotateLogs(t)),x=(e,t,n)=>b(`Upload progress`,{storage_type:e,upload_id:t,uploaded_bytes:n.uploadedBytes,total_bytes:n.totalBytes,progress_percentage:Math.round(n.uploadedBytes/n.totalBytes*100),...n.partNumber&&{part_number:n.partNumber},...n.speed&&{upload_speed_bps:n.speed}}),S=(e,t,n,r)=>b(`${e.toUpperCase()} ${t}`,{storage_type:e,operation:t,upload_id:n,...r}),C=(e,t,n)=>{let r=n.throughputBps?n.throughputBps/(1024*1024):0;return b(`${e.toUpperCase()} upload completed`,{storage_type:e,upload_id:t,file_size_bytes:n.fileSize,file_size_mb:Math.round(n.fileSize/(1024*1024)*100)/100,total_duration_ms:n.totalDurationMs,total_duration_seconds:Math.round(n.totalDurationMs/1e3*100)/100,throughput_bps:n.throughputBps,throughput_mbps:Math.round(r*100)/100,...n.partsCount&&{parts_count:n.partsCount},...n.averagePartSize&&{average_part_size_bytes:n.averagePartSize,average_part_size_mb:Math.round(n.averagePartSize/(1024*1024)*100)/100},...n.retryCount&&{retry_count:n.retryCount}})},w=e=>({uploadRequestsTotal:c.Metric.counter(`${e}_upload_requests_total`,{description:`Total number of upload requests for ${e}`}),uploadPartsTotal:c.Metric.counter(`${e}_upload_parts_total`,{description:`Total number of individual parts uploaded for ${e}`}),uploadSuccessTotal:c.Metric.counter(`${e}_upload_success_total`,{description:`Total number of successful uploads for ${e}`}),uploadErrorsTotal:c.Metric.counter(`${e}_upload_errors_total`,{description:`Total number of upload errors for ${e}`}),apiCallsTotal:c.Metric.counter(`${e}_api_calls_total`,{description:`Total number of API calls for ${e}`})}),T=e=>({uploadDurationHistogram:c.Metric.histogram(`${e}_upload_duration_seconds`,c.MetricBoundaries.exponential({start:.01,factor:2,count:20}),`Duration of upload operations in seconds for ${e}`),partUploadDurationHistogram:c.Metric.histogram(`${e}_part_upload_duration_seconds`,c.MetricBoundaries.exponential({start:.001,factor:2,count:15}),`Duration of individual part uploads in seconds for ${e}`),fileSizeHistogram:c.Metric.histogram(`${e}_file_size_bytes`,c.MetricBoundaries.exponential({start:1024,factor:2,count:25}),`Size of uploaded files in bytes for ${e}`),partSizeHistogram:c.Metric.histogram(`${e}_part_size_bytes`,c.MetricBoundaries.linear({start:5242880,width:1048576,count:20}),`Size of upload parts in bytes for ${e}`)}),le=e=>({activeUploadsGauge:c.Metric.gauge(`${e}_active_uploads`,{description:`Number of currently active uploads for ${e}`}),uploadThroughputGauge:c.Metric.gauge(`${e}_upload_throughput_bytes_per_second`,{description:`Current upload throughput in bytes per second for ${e}`})}),ue=e=>({uploadLatencySummary:c.Metric.summary({name:`${e}_upload_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Upload latency percentiles for ${e}`})}),E=e=>({...w(e),...T(e),...le(e),...ue(e)}),D=e=>{let t=E(e),n={serviceName:`test-${e}-store`,storageType:e,metrics:t,enabled:!0};return c.Layer.succeed(m,n)},O=()=>{let e={serviceName:`test-upload-server`,enabled:!0,metrics:{uploadCreated:c.Effect.void,uploadCompleted:c.Effect.void,uploadFailed:c.Effect.void,chunkUploaded:c.Effect.void}};return c.Layer.succeed(h,e)},k=()=>{let e={serviceName:`test-flow-engine`,enabled:!0,metrics:{flowStarted:c.Effect.void,flowCompleted:c.Effect.void,flowFailed:c.Effect.void,nodeExecuted:c.Effect.void}};return c.Layer.succeed(g,e)},de=e=>c.Effect.gen(function*(){let t=yield*e;return yield*c.Metric.snapshot,t}),fe=e=>c.Effect.gen(function*(){yield*c.Metric.snapshot;let t=yield*e;return yield*c.Metric.snapshot,t}),A=(e=`test-storage`)=>({storageObservability:D(e),uploadObservability:O(),flowObservability:k()}),pe=(e,t=`test-storage`)=>{let n=A(t);return e.pipe(c.Effect.provide(n.storageObservability),c.Effect.provide(n.uploadObservability),c.Effect.provide(n.flowObservability))},me=c.Context.GenericTag(`TracingService`),he=e=>{let t=e?.serviceName??`uploadista-storage`;return c.Layer.succeed(me,{serviceName:t})},j=e=>he({serviceName:`uploadista-${e}-store`}),M=(e,t,n)=>r=>r.pipe(c.Effect.withSpan(`${t}-${e}`,{attributes:{"storage.type":t,operation:e,...n}})),ge=l.WebSdk.layer(()=>({resource:{serviceName:`uploadista-storage`},spanProcessor:new u.BatchSpanProcessor(new u.ConsoleSpanExporter)})),_e=l.NodeSdk.layer(()=>({resource:{serviceName:`uploadista-storage`},spanProcessor:new u.BatchSpanProcessor(new u.ConsoleSpanExporter)})),ve=l.WebSdk.layer(()=>({resource:{serviceName:`uploadista-storage-workers`},spanProcessor:new u.BatchSpanProcessor(new u.ConsoleSpanExporter)})),N=(e,t,n)=>n.pipe(c.Effect.tap(()=>e.uploadRequestsTotal.pipe(c.Metric.tagged(`upload_id`,t))(c.Effect.succeed(1))),c.Effect.tapError(()=>e.uploadErrorsTotal.pipe(c.Metric.tagged(`upload_id`,t))(c.Effect.succeed(1))),c.Effect.tap(()=>e.uploadSuccessTotal.pipe(c.Metric.tagged(`upload_id`,t))(c.Effect.succeed(1)))),P=(e,t,n)=>n.pipe(c.Effect.tap(()=>e.apiCallsTotal.pipe(c.Metric.tagged(`operation`,t))(c.Effect.succeed(1)))),F=(e,t)=>c.Effect.gen(function*(){let n=yield*c.Effect.sync(()=>Date.now()),r=yield*t,i=((yield*c.Effect.sync(()=>Date.now()))-n)/1e3;return yield*e(c.Effect.succeed(i)),r}),I=(e,t,n)=>n.pipe(c.Effect.tap(()=>e.fileSizeHistogram(c.Effect.succeed(t)))),ye=(e,t,n)=>n.pipe(c.Effect.tap(()=>e.partSizeHistogram(c.Effect.succeed(t)))),L=(e,t)=>t.pipe(c.Effect.tap(()=>e.activeUploadsGauge(c.Effect.succeed(1))),c.Effect.ensuring(e.activeUploadsGauge(c.Effect.succeed(-1)))),R=(e,t,n)=>c.Effect.gen(function*(){let r=yield*c.Effect.sync(()=>Date.now()),i=yield*n,a=((yield*c.Effect.sync(()=>Date.now()))-r)/1e3,o=a>0?t/a:0;return yield*e.uploadThroughputGauge(c.Effect.succeed(o)),i}),z=(e,t,n,r,i)=>{let a=r.pipe(n=>P(e,t,n),t=>N(e,n,t),t=>F(e.uploadDurationHistogram,t),t=>L(e,t));return i!==void 0&&(a=a.pipe(t=>I(e,i,t),t=>R(e,i,t))),a},B=()=>({flowStartedTotal:c.Metric.counter(`flow_started_total`,{description:`Total number of flows started`}),flowCompletedTotal:c.Metric.counter(`flow_completed_total`,{description:`Total number of flows completed successfully`}),flowFailedTotal:c.Metric.counter(`flow_failed_total`,{description:`Total number of flows that failed`}),flowPausedTotal:c.Metric.counter(`flow_paused_total`,{description:`Total number of flows that were paused`}),flowResumedTotal:c.Metric.counter(`flow_resumed_total`,{description:`Total number of flows that were resumed`}),nodeExecutedTotal:c.Metric.counter(`node_executed_total`,{description:`Total number of nodes executed`}),nodeSuccessTotal:c.Metric.counter(`node_success_total`,{description:`Total number of nodes executed successfully`}),nodeFailedTotal:c.Metric.counter(`node_failed_total`,{description:`Total number of nodes that failed`}),nodeSkippedTotal:c.Metric.counter(`node_skipped_total`,{description:`Total number of nodes skipped (conditional)`}),flowDurationHistogram:c.Metric.histogram(`flow_duration_seconds`,c.MetricBoundaries.exponential({start:.1,factor:2,count:20}),`Duration of complete flow execution in seconds`),nodeDurationHistogram:c.Metric.histogram(`node_duration_seconds`,c.MetricBoundaries.exponential({start:.01,factor:2,count:18}),`Duration of individual node execution in seconds`),flowNodeCountHistogram:c.Metric.histogram(`flow_node_count`,c.MetricBoundaries.linear({start:1,width:5,count:20}),`Number of nodes in a flow`),parallelNodesHistogram:c.Metric.histogram(`parallel_nodes_count`,c.MetricBoundaries.linear({start:1,width:2,count:15}),`Number of nodes executed in parallel`),activeFlowsGauge:c.Metric.gauge(`active_flows`,{description:`Number of currently active flows`}),activeNodesGauge:c.Metric.gauge(`active_nodes`,{description:`Number of currently executing nodes`}),pausedFlowsGauge:c.Metric.gauge(`paused_flows`,{description:`Number of currently paused flows`}),flowLatencySummary:c.Metric.summary({name:`flow_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Flow execution latency percentiles`}),nodeLatencySummary:c.Metric.summary({name:`node_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Node execution latency percentiles`})}),be=B(),xe=(e,t)=>n=>n.pipe(c.Effect.withSpan(`flow-${e}`,{attributes:{"flow.operation":e,...t}})),Se=e=>c.Effect.annotateCurrentSpan({"flow.id":e.flowId??`unknown`,"flow.name":e.flowName??`unknown`,"flow.job_id":e.jobId??`unknown`,"flow.node_count":e.nodeCount?.toString()??`0`,"flow.storage_id":e.storageId??`unknown`}),Ce=e=>c.Effect.annotateCurrentSpan({"node.id":e.nodeId,"node.type":e.nodeType,"node.name":e.nodeName??`unknown`,"node.flow_id":e.flowId??`unknown`,"node.job_id":e.jobId??`unknown`}),we=e=>c.Effect.annotateCurrentSpan({"execution.order":e.executionOrder?.join(`,`)??``,"execution.current_index":e.currentIndex?.toString()??`0`,"execution.total_nodes":e.totalNodes?.toString()??`0`,"execution.parallel_count":e.parallelCount?.toString()??`0`}),V=(e=`uploadista-flow-engine`)=>{let t=B();return c.Layer.succeed(g,{serviceName:e,enabled:!0,metrics:{flowStarted:c.Metric.increment(t.flowStartedTotal),flowCompleted:c.Metric.increment(t.flowCompletedTotal),flowFailed:c.Metric.increment(t.flowFailedTotal),nodeExecuted:c.Metric.increment(t.nodeExecutedTotal)}})},Te=V(),Ee=v(!1),De=c.Effect.gen(function*(){return(yield*g).metrics}),Oe=e=>{let t=B();return c.Effect.gen(function*(){let n=Date.now(),r=yield*e,i=(Date.now()-n)/1e3;return yield*c.Metric.update(t.flowDurationHistogram,i),yield*c.Metric.update(t.flowLatencySummary,i),r}).pipe(c.Effect.withSpan(`flow-execution`))},ke=(e,t,n)=>{let r=B();return c.Effect.gen(function*(){let e=Date.now(),t=yield*n,i=(Date.now()-e)/1e3;return yield*c.Metric.update(r.nodeDurationHistogram,i),yield*c.Metric.update(r.nodeLatencySummary,i),t}).pipe(c.Effect.withSpan(`node-${t}`,{attributes:{"node.id":e,"node.type":t}}))},Ae=e=>{let t=B();return c.Effect.gen(function*(){return yield*c.Metric.increment(t.activeFlowsGauge),yield*c.Effect.acquireUseRelease(c.Effect.void,()=>e,()=>c.Metric.set(t.activeFlowsGauge,-1))})},je=e=>{let t=B();return c.Effect.gen(function*(){return yield*c.Metric.increment(t.activeNodesGauge),yield*c.Effect.acquireUseRelease(c.Effect.void,()=>e,()=>c.Metric.set(t.activeNodesGauge,-1))})},H=e=>{if(!e||typeof e!=`object`)return`unknown_flow_error`;let t=`code`in e?e.code:void 0;if(!t)return`unknown_flow_error`;switch(t){case`FLOW_VALIDATION_ERROR`:case`FLOW_INVALID_INPUT`:case`FLOW_INVALID_OUTPUT`:return`flow_validation_error`;case`FLOW_NODE_NOT_FOUND`:case`FLOW_EDGE_INVALID`:return`node_not_found_error`;case`FLOW_NODE_EXECUTION_FAILED`:case`FLOW_NODE_ERROR`:return`node_execution_error`;case`FLOW_TIMEOUT`:return`flow_timeout_error`;case`FLOW_CANCELLED`:case`ABORTED`:return`flow_cancelled_error`;default:return`unknown_flow_error`}},Me=e=>{let t=B(),n=H(e);return c.Effect.gen(function*(){yield*c.Metric.increment(t.flowFailedTotal),yield*c.Effect.logError(`Flow execution failed`).pipe(c.Effect.annotateLogs({"error.category":n,"error.message":String(e)}))})},Ne=(e,t,n)=>{let r=B(),i=H(n);return c.Effect.gen(function*(){yield*c.Metric.increment(r.nodeFailedTotal),yield*c.Effect.logError(`Node execution failed`).pipe(c.Effect.annotateLogs({"node.id":e,"node.type":t,"error.category":i,"error.message":String(n)}))})},U=()=>{let e={serviceName:`test-flow-engine`,enabled:!0,metrics:{flowStarted:c.Effect.void,flowCompleted:c.Effect.void,flowFailed:c.Effect.void,nodeExecuted:c.Effect.void}};return c.Layer.succeed(g,e)},Pe=e=>e.pipe(c.Effect.provide(U()));var W=class extends c.Context.Tag(`MetricsService`)(){};const Fe=c.Layer.succeed(W,{recordUpload:(e,t)=>c.Effect.void}),Ie=`s3`,G=E(`s3`),K=j(`s3`),Le=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:void 0;if(!t)return null;switch(t){case`NoSuchKey`:case`NoSuchBucket`:case`NoSuchUpload`:return`client_error`;case`BucketAlreadyExists`:case`BucketNotEmpty`:return`client_error`;case`InvalidBucketName`:case`InvalidPart`:case`InvalidPartOrder`:return`client_error`;case`EntityTooSmall`:case`EntityTooLarge`:return`client_error`;case`ExpiredToken`:case`TokenRefreshRequired`:return`authentication_error`;case`RequestTimeTooSkewed`:case`SlowDown`:return`throttling_error`;default:return null}},Re=f(`s3`,G,Le),ze=c.Layer.mergeAll(K),Be=(e,t)=>N(G,e,t),Ve=(e,t)=>P(G,e,t),He=F,Ue=(e,t,n,r)=>z(G,e,t,n,r),We=(e,t)=>n=>M(e,`s3`,t)(n),Ge=S.bind(null,`s3`),Ke=x.bind(null,`s3`),qe=C.bind(null,`s3`),Je=b,{uploadRequestsTotal:Ye,uploadPartsTotal:Xe,uploadSuccessTotal:Ze,uploadErrorsTotal:Qe,apiCallsTotal:$e,uploadDurationHistogram:et,partUploadDurationHistogram:tt,fileSizeHistogram:nt,partSizeHistogram:rt,activeUploadsGauge:it,uploadThroughputGauge:at,uploadLatencySummary:ot}=G,q=`azure`,J=E(q),st=j(q),ct=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:`statusCode`in e?e.statusCode:void 0;if(!t)return null;switch(t){case`BlobNotFound`:case`ContainerNotFound`:case`InvalidBlobOrBlock`:return`client_error`;case`ContainerAlreadyExists`:case`BlobAlreadyExists`:return`client_error`;case`InvalidBlockId`:case`InvalidBlockList`:case`InvalidBlobType`:return`client_error`;case`RequestBodyTooLarge`:case`InvalidHeaderValue`:return`client_error`;case`AuthenticationFailed`:case`InvalidAuthenticationInfo`:return`authentication_error`;case`AccountIsDisabled`:return`authorization_error`;case`InsufficientAccountPermissions`:return`authorization_error`;case`OperationTimedOut`:case`ServerBusy`:case`InternalError`:return`server_error`;default:if(typeof t==`number`){if(t>=500)return`server_error`;if(t===429)return`throttling_error`;if(t===403)return`authorization_error`;if(t===401)return`authentication_error`;if(t>=400)return`client_error`}return null}},lt=f(q,J,ct),ut=c.Layer.mergeAll(st),dt=(e,t)=>N(J,e,t),ft=(e,t)=>P(J,e,t),pt=F,mt=(e,t,n,r)=>z(J,e,t,n,r),ht=(e,t)=>n=>M(e,q,t)(n),gt=S.bind(null,q),_t=x.bind(null,q),vt=C.bind(null,q),yt=b,{uploadRequestsTotal:bt,uploadPartsTotal:xt,uploadSuccessTotal:St,uploadErrorsTotal:Ct,apiCallsTotal:wt,uploadDurationHistogram:Tt,partUploadDurationHistogram:Et,fileSizeHistogram:Dt,partSizeHistogram:Ot,activeUploadsGauge:kt,uploadThroughputGauge:At,uploadLatencySummary:jt}=J,Mt=`gcs`,Y=E(`gcs`),Nt=j(`gcs`),Pt=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:`status`in e?e.status:void 0;if(!t)return null;switch(t){case`NoSuchBucket`:case`NoSuchKey`:case`NoSuchUpload`:return`client_error`;case`BucketAlreadyOwnedByYou`:case`BucketNotEmpty`:return`client_error`;case`InvalidBucketName`:case`InvalidArgument`:case`InvalidPart`:case`InvalidPartOrder`:return`client_error`;case`EntityTooSmall`:case`EntityTooLarge`:return`client_error`;case`MalformedPolicy`:return`client_error`;case`Unauthorized`:case`AuthenticationRequired`:return`authentication_error`;case`Forbidden`:case`AccessDenied`:return`authorization_error`;case`TooManyRequests`:case`RateLimitExceeded`:return`throttling_error`;case`InternalError`:case`ServiceUnavailable`:case`BackendError`:return`server_error`;default:if(typeof t==`number`){if(t>=500)return`server_error`;if(t===429)return`throttling_error`;if(t===403)return`authorization_error`;if(t===401)return`authentication_error`;if(t>=400)return`client_error`}return null}},Ft=f(`gcs`,Y,Pt),It=c.Layer.mergeAll(Nt),Lt=(e,t)=>N(Y,e,t),Rt=(e,t)=>P(Y,e,t),zt=F,Bt=(e,t,n,r)=>z(Y,e,t,n,r),Vt=(e,t)=>n=>M(e,`gcs`,t)(n),Ht=S.bind(null,`gcs`),Ut=x.bind(null,`gcs`),Wt=C.bind(null,`gcs`),Gt=b,{uploadRequestsTotal:Kt,uploadPartsTotal:qt,uploadSuccessTotal:Jt,uploadErrorsTotal:Yt,apiCallsTotal:Xt,uploadDurationHistogram:Zt,partUploadDurationHistogram:Qt,fileSizeHistogram:$t,partSizeHistogram:en,activeUploadsGauge:tn,uploadThroughputGauge:nn,uploadLatencySummary:rn}=Y,X=`filesystem`,Z=E(X),an=j(X),on=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:void 0;if(!t)return null;switch(t){case`ENOENT`:case`ENOTDIR`:return`client_error`;case`EEXIST`:return`client_error`;case`EISDIR`:return`client_error`;case`EINVAL`:case`ENAMETOOLONG`:return`client_error`;case`EACCES`:case`EPERM`:return`authorization_error`;case`ENOSPC`:case`EDQUOT`:return`server_error`;case`EIO`:case`EROFS`:case`EMFILE`:case`ENFILE`:return`server_error`;case`EBUSY`:return`throttling_error`;default:return null}},sn=f(X,Z,on),cn=c.Layer.mergeAll(an),ln=(e,t)=>N(Z,e,t),un=(e,t)=>P(Z,e,t),dn=F,fn=(e,t,n,r)=>z(Z,e,t,n,r),pn=(e,t)=>n=>M(e,X,t)(n),mn=S.bind(null,X),hn=x.bind(null,X),gn=C.bind(null,X),_n=b,{uploadRequestsTotal:vn,uploadPartsTotal:yn,uploadSuccessTotal:bn,uploadErrorsTotal:xn,apiCallsTotal:Sn,uploadDurationHistogram:Cn,partUploadDurationHistogram:wn,fileSizeHistogram:Tn,partSizeHistogram:En,activeUploadsGauge:Dn,uploadThroughputGauge:On,uploadLatencySummary:kn}=Z,Q=()=>({uploadCreatedTotal:c.Metric.counter(`upload_created_total`,{description:`Total number of uploads created`}),uploadCompletedTotal:c.Metric.counter(`upload_completed_total`,{description:`Total number of uploads completed successfully`}),uploadFailedTotal:c.Metric.counter(`upload_failed_total`,{description:`Total number of uploads that failed`}),chunkUploadedTotal:c.Metric.counter(`chunk_uploaded_total`,{description:`Total number of chunks uploaded`}),uploadFromUrlTotal:c.Metric.counter(`upload_from_url_total`,{description:`Total number of URL-based uploads`}),uploadFromUrlSuccessTotal:c.Metric.counter(`upload_from_url_success_total`,{description:`Total number of successful URL-based uploads`}),uploadFromUrlFailedTotal:c.Metric.counter(`upload_from_url_failed_total`,{description:`Total number of failed URL-based uploads`}),uploadDurationHistogram:c.Metric.histogram(`upload_duration_seconds`,c.MetricBoundaries.exponential({start:.01,factor:2,count:20}),`Duration of complete upload operations in seconds`),chunkUploadDurationHistogram:c.Metric.histogram(`chunk_upload_duration_seconds`,c.MetricBoundaries.exponential({start:.001,factor:2,count:15}),`Duration of individual chunk uploads in seconds`),uploadFileSizeHistogram:c.Metric.histogram(`upload_file_size_bytes`,c.MetricBoundaries.exponential({start:1024,factor:2,count:25}),`Size of uploaded files in bytes`),chunkSizeHistogram:c.Metric.histogram(`chunk_size_bytes`,c.MetricBoundaries.linear({start:262144,width:262144,count:20}),`Size of uploaded chunks in bytes`),activeUploadsGauge:c.Metric.gauge(`active_uploads`,{description:`Number of currently active uploads`}),uploadThroughputGauge:c.Metric.gauge(`upload_throughput_bytes_per_second`,{description:`Current upload throughput in bytes per second`}),uploadLatencySummary:c.Metric.summary({name:`upload_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Upload operation latency percentiles`}),chunkLatencySummary:c.Metric.summary({name:`chunk_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Chunk upload latency percentiles`})}),An=Q(),jn=(e,t)=>n=>n.pipe(c.Effect.withSpan(`upload-${e}`,{attributes:{"upload.operation":e,...t}})),Mn=e=>c.Effect.annotateCurrentSpan({"upload.id":e.uploadId??`unknown`,"upload.file_name":e.fileName??`unknown`,"upload.file_size":e.fileSize?.toString()??`0`,"upload.storage_id":e.storageId??`unknown`,"upload.mime_type":e.mimeType??`unknown`}),Nn=e=>c.Effect.annotateCurrentSpan({"chunk.upload_id":e.uploadId,"chunk.size":e.chunkSize.toString(),"chunk.offset":e.offset.toString(),"chunk.total_size":e.totalSize?.toString()??`0`,"chunk.progress":e.totalSize&&e.totalSize>0?(e.offset/e.totalSize*100).toFixed(2):`0`}),Pn=(e=`uploadista-upload-server`)=>{let t=Q();return c.Layer.succeed(h,{serviceName:e,enabled:!0,metrics:{uploadCreated:c.Effect.succeed(t.uploadCreatedTotal).pipe(c.Effect.flatMap(e=>c.Metric.increment(e))),uploadCompleted:c.Effect.succeed(t.uploadCompletedTotal).pipe(c.Effect.flatMap(e=>c.Metric.increment(e))),uploadFailed:c.Effect.succeed(t.uploadFailedTotal).pipe(c.Effect.flatMap(e=>c.Metric.increment(e))),chunkUploaded:c.Effect.succeed(t.chunkUploadedTotal).pipe(c.Effect.flatMap(e=>c.Metric.increment(e)))}})},Fn=Pn(),In=_(!1),Ln=c.Effect.gen(function*(){return(yield*h).metrics}),Rn=e=>{let t=Q();return c.Effect.gen(function*(){let n=Date.now(),r=yield*e,i=(Date.now()-n)/1e3;return yield*c.Metric.update(t.uploadDurationHistogram,i),r}).pipe(c.Effect.withSpan(`upload-operation`))},zn=e=>{let t=Q();return c.Effect.gen(function*(){let n=Date.now(),r=yield*e,i=(Date.now()-n)/1e3;return yield*c.Metric.update(t.chunkUploadDurationHistogram,i),r}).pipe(c.Effect.withSpan(`chunk-upload`))},$=e=>{if(!e||typeof e!=`object`)return`unknown_error`;let t=`code`in e?e.code:void 0,n=`name`in e?e.name:void 0,r=e instanceof Error?e.message.toLowerCase():``;return t===`ABORTED`||n===`AbortError`||r.includes(`abort`)?`abort_error`:t===`FILE_TOO_LARGE`||t===`LIMIT_FILE_SIZE`||t===`RequestEntityTooLarge`||r.includes(`too large`)||r.includes(`size limit`)||r.includes(`max size`)?`size_limit_error`:t===`INVALID_FILE`||t===`INVALID_METADATA`||t===`VALIDATION_ERROR`||r.includes(`validation`)||r.includes(`invalid`)?`validation_error`:t===`NetworkError`||t===`ECONNRESET`||t===`ENOTFOUND`||t===`ETIMEDOUT`||r.includes(`network`)||r.includes(`timeout`)?`network_error`:t===`UNAUTHORIZED`||t===`AuthenticationFailed`||n===`AuthenticationError`||r.includes(`authentication`)||r.includes(`unauthorized`)?`authentication_error`:t===`FORBIDDEN`||t===`AccessDenied`||n===`AuthorizationError`||r.includes(`forbidden`)||r.includes(`permission`)?`authorization_error`:t===`FILE_WRITE_ERROR`||t===`STORAGE_ERROR`||r.includes(`storage`)||r.includes(`write error`)?`storage_error`:`unknown_error`},Bn=(e,t,n,r={})=>c.Effect.gen(function*(){let i=$(n);yield*e.uploadFailedTotal.pipe(c.Metric.tagged(`operation`,t),c.Metric.tagged(`error_category`,i))(c.Effect.succeed(1));let a={operation:t,error_category:i,error_type:typeof n,error_message:n instanceof Error?n.message:String(n),error_code:n&&typeof n==`object`&&`code`in n?String(n.code):void 0,error_name:n&&typeof n==`object`&&`name`in n?String(n.name):void 0,...r};yield*c.Effect.logError(`Upload ${t} failed`).pipe(c.Effect.annotateLogs(a))}),Vn=e=>t=>{if(e){let n=e(t);if(n!==null)return n}return $(t)},Hn=c.Layer.succeed(h,{serviceName:`uploadista-upload-server-test`,enabled:!0,metrics:{uploadCreated:()=>Promise.resolve(),uploadCompleted:()=>Promise.resolve(),uploadFailed:()=>Promise.resolve(),chunkUploaded:()=>Promise.resolve()}}),Un=()=>Q(),Wn=()=>{let e=Un(),t=[`uploadCreatedTotal`,`uploadCompletedTotal`,`uploadFailedTotal`,`chunkUploadedTotal`,`uploadFromUrlTotal`,`uploadFromUrlSuccessTotal`,`uploadFromUrlFailedTotal`,`uploadDurationHistogram`,`chunkUploadDurationHistogram`,`uploadFileSizeHistogram`,`chunkSizeHistogram`,`activeUploadsGauge`,`uploadThroughputGauge`,`uploadLatencySummary`,`chunkLatencySummary`].filter(t=>!(t in e));if(t.length>0)throw Error(`Missing required metrics: ${t.join(`, `)}`);return!0};exports.AzureObservabilityLayer=ut,exports.AzureTracingLayer=st,exports.FilesystemObservabilityLayer=cn,exports.FilesystemTracingLayer=an,exports.FlowObservability=g,exports.FlowObservabilityDisabled=se,exports.FlowObservabilityLive=Te,exports.GCSObservabilityLayer=It,exports.GCSTracingLayer=Nt,exports.MetricsService=W,exports.NoOpMetricsServiceLive=Fe,exports.NodeSdkLive=_e,exports.Observability=p,exports.ObservabilityDisabled=ie,exports.S3ObservabilityLayer=ze,exports.S3TracingLayer=K,exports.StorageObservability=m,exports.StorageObservabilityDisabled=ae,exports.TracingService=me,exports.UploadObservability=h,exports.UploadObservabilityDisabled=oe,exports.UploadObservabilityLive=Fn,exports.UploadObservabilityTest=Hn,exports.WebSdkLive=ge,exports.WorkersSdkLive=ve,exports.azureActiveUploadsGauge=kt,exports.azureApiCallsTotal=wt,exports.azureFileSizeHistogram=Dt,exports.azureMetrics=J,exports.azurePartSizeHistogram=Ot,exports.azurePartUploadDurationHistogram=Et,exports.azureUploadDurationHistogram=Tt,exports.azureUploadErrorsTotal=Ct,exports.azureUploadLatencySummary=jt,exports.azureUploadPartsTotal=xt,exports.azureUploadRequestsTotal=bt,exports.azureUploadSuccessTotal=St,exports.azureUploadThroughputGauge=At,exports.captureMetrics=de,exports.classifyFlowError=H,exports.classifyStorageError=d,exports.classifyUploadError=$,exports.createFlowMetrics=B,exports.createStorageErrorClassifier=ee,exports.createStorageErrorTracker=f,exports.createStorageMetrics=E,exports.createStorageTracingLayer=j,exports.createTestFixture=A,exports.createTracingLayer=he,exports.createUploadErrorClassifier=Vn,exports.createUploadGauges=le,exports.createUploadHistograms=T,exports.createUploadMetrics=w,exports.createUploadServerMetrics=Q,exports.createUploadSummaries=ue,exports.filesystemActiveUploadsGauge=Dn,exports.filesystemApiCallsTotal=Sn,exports.filesystemFileSizeHistogram=Tn,exports.filesystemMetrics=Z,exports.filesystemPartSizeHistogram=En,exports.filesystemPartUploadDurationHistogram=wn,exports.filesystemUploadDurationHistogram=Cn,exports.filesystemUploadErrorsTotal=xn,exports.filesystemUploadLatencySummary=kn,exports.filesystemUploadPartsTotal=yn,exports.filesystemUploadRequestsTotal=vn,exports.filesystemUploadSuccessTotal=bn,exports.filesystemUploadThroughputGauge=On,exports.flowMetrics=be,exports.gcsActiveUploadsGauge=tn,exports.gcsApiCallsTotal=Xt,exports.gcsFileSizeHistogram=$t,exports.gcsMetrics=Y,exports.gcsPartSizeHistogram=en,exports.gcsPartUploadDurationHistogram=Qt,exports.gcsUploadDurationHistogram=Zt,exports.gcsUploadErrorsTotal=Yt,exports.gcsUploadLatencySummary=rn,exports.gcsUploadPartsTotal=qt,exports.gcsUploadRequestsTotal=Kt,exports.gcsUploadSuccessTotal=Jt,exports.gcsUploadThroughputGauge=nn,exports.getFlowMetrics=De,exports.getTestMetrics=Un,exports.getUploadMetrics=Ln,exports.isObservabilityEnabled=y,exports.logAzureContext=yt,exports.logAzureOperation=gt,exports.logAzureUploadCompletion=vt,exports.logAzureUploadProgress=_t,exports.logFilesystemContext=_n,exports.logFilesystemOperation=mn,exports.logFilesystemUploadCompletion=gn,exports.logFilesystemUploadProgress=hn,exports.logGCSContext=Gt,exports.logGCSOperation=Ht,exports.logGCSUploadCompletion=Wt,exports.logGCSUploadProgress=Ut,exports.logS3Context=Je,exports.logS3Operation=Ge,exports.logS3UploadCompletion=qe,exports.logS3UploadProgress=Ke,exports.logStorageOperation=S,exports.logUploadCompletion=C,exports.logUploadProgress=x,exports.logWithContext=b,exports.makeFlowObservabilityLayer=v,exports.makeFlowObservabilityLive=V,exports.makeObservabilityLayer=ne,exports.makeStorageObservabilityLayer=re,exports.makeTestFlowObservability=k,exports.makeTestFlowObservabilityUtil=U,exports.makeTestStorageObservability=D,exports.makeTestUploadObservability=O,exports.makeUploadObservabilityLayer=_,exports.makeUploadObservabilityLive=Pn,exports.runWithTestFlowObservability=Pe,exports.runWithTestObservability=pe,exports.s3ActiveUploadsGauge=it,exports.s3ApiCallsTotal=$e,exports.s3FileSizeHistogram=nt,exports.s3Metrics=G,exports.s3PartSizeHistogram=rt,exports.s3PartUploadDurationHistogram=tt,exports.s3UploadDurationHistogram=et,exports.s3UploadErrorsTotal=Qe,exports.s3UploadLatencySummary=ot,exports.s3UploadPartsTotal=Xe,exports.s3UploadRequestsTotal=Ye,exports.s3UploadSuccessTotal=Ze,exports.s3UploadThroughputGauge=at,exports.trackActiveFlow=Ae,exports.trackActiveNode=je,exports.trackAzureError=lt,exports.trackFileSize=I,exports.trackFilesystemError=sn,exports.trackFlowError=Me,exports.trackGCSError=Ft,exports.trackNodeError=Ne,exports.trackPartSize=ye,exports.trackS3Error=Re,exports.trackStorageError=te,exports.trackUploadError=Bn,exports.uploadServerMetrics=An,exports.validateMetricsExist=Wn,exports.whenObservabilityEnabled=ce,exports.withActiveUploadTracking=L,exports.withApiMetrics=P,exports.withAzureApiMetrics=ft,exports.withAzureOperationMetrics=mt,exports.withAzureSpan=ht,exports.withAzureTimingMetrics=pt,exports.withAzureUploadMetrics=dt,exports.withChunkContext=Nn,exports.withChunkDuration=zn,exports.withExecutionContext=we,exports.withFilesystemApiMetrics=un,exports.withFilesystemOperationMetrics=fn,exports.withFilesystemSpan=pn,exports.withFilesystemTimingMetrics=dn,exports.withFilesystemUploadMetrics=ln,exports.withFlowContext=Se,exports.withFlowDuration=Oe,exports.withFlowSpan=xe,exports.withGCSApiMetrics=Rt,exports.withGCSOperationMetrics=Bt,exports.withGCSSpan=Vt,exports.withGCSTimingMetrics=zt,exports.withGCSUploadMetrics=Lt,exports.withMetricTracking=fe,exports.withNodeContext=Ce,exports.withNodeDuration=ke,exports.withS3ApiMetrics=Ve,exports.withS3OperationMetrics=Ue,exports.withS3Span=We,exports.withS3TimingMetrics=He,exports.withS3UploadMetrics=Be,exports.withStorageOperationMetrics=z,exports.withStorageSpan=M,exports.withThroughputTracking=R,exports.withTimingMetrics=F,exports.withUploadContext=Mn,exports.withUploadDuration=Rn,exports.withUploadMetrics=N,exports.withUploadSpan=jn;