dd-trace
Version:
Datadog APM tracing client for JavaScript
62 lines (48 loc) • 1.89 kB
JavaScript
const { EVP_EVENT_SIZE_LIMIT, EVP_PAYLOAD_SIZE_LIMIT } = require('../../constants/writers')
const { DROPPED_VALUE_TEXT } = require('../../constants/text')
const { DROPPED_IO_COLLECTION_ERROR } = require('../../constants/tags')
const BaseWriter = require('../base')
const telemetry = require('../../telemetry')
const logger = require('../../../log')
const tracerVersion = require('../../../../../../package.json').version
class LLMObsSpanWriter extends BaseWriter {
constructor (options) {
super({
...options,
eventType: 'span'
})
}
append (event) {
const eventSizeBytes = Buffer.from(JSON.stringify(event)).byteLength
telemetry.recordLLMObsRawSpanSize(event, eventSizeBytes)
const shouldTruncate = eventSizeBytes > EVP_EVENT_SIZE_LIMIT
let processedEventSizeBytes = eventSizeBytes
if (shouldTruncate) {
logger.warn(`Dropping event input/output because its size (${eventSizeBytes}) exceeds the 1MB event size limit`)
event = this._truncateSpanEvent(event)
processedEventSizeBytes = Buffer.from(JSON.stringify(event)).byteLength
}
telemetry.recordLLMObsSpanSize(event, processedEventSizeBytes, shouldTruncate)
if (this._bufferSize + eventSizeBytes > EVP_PAYLOAD_SIZE_LIMIT) {
logger.debug('Flusing queue because queing next event will exceed EvP payload limit')
this.flush()
}
super.append(event, eventSizeBytes)
}
makePayload (events) {
return events.map(event => ({
'_dd.stage': 'raw',
'_dd.tracer_version': tracerVersion,
event_type: this._eventType,
spans: [event]
}))
}
_truncateSpanEvent (event) {
event.meta.input = { value: DROPPED_VALUE_TEXT }
event.meta.output = { value: DROPPED_VALUE_TEXT }
event.collection_errors = [DROPPED_IO_COLLECTION_ERROR]
return event
}
}
module.exports = LLMObsSpanWriter