Better heirarchy and option to do conversation tracing vs transaction.
This commit is contained in:
@@ -8,45 +8,44 @@ Use the _code block_ widget to start and end spans. Spans can be nested to form
|
|||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
(async () => {
|
(async () => {
|
||||||
await latencySpan().endSpan(recognizedObject.conversationId);
|
opentelemetry.startSpan("Global Flow")
|
||||||
|
|
||||||
const span = await opentelemetry().startSpan("Global Flow");
|
|
||||||
console.log(span);
|
|
||||||
})()
|
})()
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
console.log(error.message);
|
console.error(error.message)
|
||||||
recognizedObject.answers.push("");
|
recognizedObject.answers.push('')
|
||||||
recognizedObject.errorInfo = {
|
recognizedObject.errorInfo = {
|
||||||
...recognizedObject.errorInfo,
|
...recognizedObject.errorInfo,
|
||||||
label: {
|
label: {
|
||||||
data: error.toJSON ? error.toJSON() : {},
|
data: error.toJSON ? error.toJSON() : {},
|
||||||
message: error.message,
|
message: error.message,
|
||||||
},
|
},
|
||||||
};
|
}
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
next();
|
next()
|
||||||
});
|
})
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### End Span
|
### End Span
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
(async () => {
|
(async () => {
|
||||||
await opentelemetry().endSpan();
|
opentelemetry.endSpan("Global Flow")
|
||||||
})()
|
})()
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
console.log(error.message);
|
console.error(error.message)
|
||||||
recognizedObject.answers.push("");
|
recognizedObject.answers.push('')
|
||||||
recognizedObject.errorInfo = {
|
recognizedObject.errorInfo = {
|
||||||
...recognizedObject.errorInfo,
|
...recognizedObject.errorInfo,
|
||||||
label: {
|
label: {
|
||||||
data: error.toJSON ? error.toJSON() : {},
|
data: error.toJSON ? error.toJSON() : {},
|
||||||
message: error.message,
|
message: error.message,
|
||||||
},
|
},
|
||||||
};
|
}
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
next();
|
next()
|
||||||
});
|
})
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -1,105 +1,152 @@
|
|||||||
const traces = axios.create({
|
const {
|
||||||
baseURL: opentelemetry_settings.baseUrl,
|
recognizedObject: r = {},
|
||||||
timeout: 16000,
|
traces = axios.create({
|
||||||
})
|
baseURL: opentelemetry_settings.baseUrl,
|
||||||
return {
|
timeout: 16000,
|
||||||
async startSpan(name) {
|
}),
|
||||||
try {
|
} = this;
|
||||||
if (!conversationData.spans) {
|
|
||||||
conversationData.spans = []
|
|
||||||
}
|
|
||||||
const spanName = name ? name : 'default'
|
|
||||||
|
|
||||||
const span = {
|
function generateIdHex(numBytes = 8) {
|
||||||
resourceSpans: [
|
const bytes = crypto.getRandomValues(new Uint8Array(numBytes));
|
||||||
{
|
return Array.from(bytes)
|
||||||
resource: {
|
.map(b => b.toString(16).padStart(2, '0'))
|
||||||
attributes: [
|
.join('');
|
||||||
{
|
|
||||||
key: 'service.name',
|
|
||||||
value: {
|
|
||||||
stringValue: 'ivastudio.verint.live',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
scopeSpans: [
|
|
||||||
{
|
|
||||||
scope: {
|
|
||||||
name: recognizedObject.conversationId,
|
|
||||||
version: '1.0.0',
|
|
||||||
attributes: [
|
|
||||||
{
|
|
||||||
key: 'my.scope.attribute',
|
|
||||||
value: {
|
|
||||||
stringValue: 'some scope attribute',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
spans: [
|
|
||||||
{
|
|
||||||
// traceId: recognizedObject.req.headers['x-b3-traceid'],
|
|
||||||
traceId: recognizedObject.conversationId.replace(/-/gi, ''),
|
|
||||||
spanId: recognizedObject.req.headers['x-b3-spanid'],
|
|
||||||
// parentSpanId: recognizedObject.req.headers['x-b3-parentspanid'],
|
|
||||||
name: spanName,
|
|
||||||
startTimeUnixNano: '' + Date.now() * 1000000,
|
|
||||||
kind: 2,
|
|
||||||
attributes: [
|
|
||||||
{
|
|
||||||
key: 'conversationId',
|
|
||||||
value: {
|
|
||||||
stringValue: recognizedObject.conversationId,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 'workspaceId',
|
|
||||||
value: {
|
|
||||||
stringValue: recognizedObject.workspaceId,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 'input',
|
|
||||||
value: {
|
|
||||||
stringValue: recognizedObject.input,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}
|
|
||||||
conversationData.spans.push(span)
|
|
||||||
return span
|
|
||||||
} catch (e) {
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async endSpan() {
|
|
||||||
try {
|
|
||||||
const data = conversationData.spans.pop()
|
|
||||||
|
|
||||||
data.resourceSpans[0].scopeSpans[0].spans[0].endTimeUnixNano = '' + Date.now() * 1000000
|
|
||||||
|
|
||||||
data.resourceSpans[0].scopeSpans[0].spans[0].attributes.push({
|
|
||||||
key: 'answers',
|
|
||||||
value: {
|
|
||||||
stringValue: JSON.stringify(recognizedObject.answers),
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const response = await traces.post(`/v1/traces`, data, {
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
return response.data
|
|
||||||
} catch (e) {
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
async startSpan(name) {
|
||||||
|
if (name == null) {
|
||||||
|
throw new Error("Span name is required");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize telemetry object if it doesn't exist
|
||||||
|
if ("telemetry" in r == false) {
|
||||||
|
r.telemetry = [];
|
||||||
|
if (opentelemetry_settings.trace == "conversation") {
|
||||||
|
r.telemetry.traceId = r.conversationId.replace(/-/gi, "");
|
||||||
|
} else {
|
||||||
|
r.telemetry.traceId = generateIdHex(16);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const span = {
|
||||||
|
name: name,
|
||||||
|
resourceSpans: [
|
||||||
|
{
|
||||||
|
resource: {
|
||||||
|
attributes: [
|
||||||
|
{
|
||||||
|
key: "service.name",
|
||||||
|
value: {
|
||||||
|
stringValue: "ivastudio.verint.live",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
scopeSpans: [
|
||||||
|
{
|
||||||
|
scope: {
|
||||||
|
name: r.conversationId,
|
||||||
|
version: "1.0.0",
|
||||||
|
attributes: [
|
||||||
|
{
|
||||||
|
key: "my.scope.attribute",
|
||||||
|
value: {
|
||||||
|
stringValue: "some scope attribute",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
spans: [
|
||||||
|
{
|
||||||
|
traceId: r.telemetry.traceId,
|
||||||
|
spanId: generateIdHex(),
|
||||||
|
name: name,
|
||||||
|
startTimeUnixNano: "" + Date.now() * 1000000,
|
||||||
|
kind: 2,
|
||||||
|
attributes: [
|
||||||
|
{
|
||||||
|
key: "conversationId",
|
||||||
|
value: {
|
||||||
|
stringValue: r.conversationId,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "workspaceId",
|
||||||
|
value: {
|
||||||
|
stringValue: r.workspaceId,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: "input",
|
||||||
|
value: {
|
||||||
|
stringValue: r.input,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
r.telemetry.unshift(span);
|
||||||
|
return span;
|
||||||
|
} catch (e) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
async endSpan(name) {
|
||||||
|
if (name == null) {
|
||||||
|
throw new Error("Span name is required");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("telemetry" in r == false) {
|
||||||
|
// nothing to end
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const spanIndex = r.telemetry.findIndex((span) => span.name === name);
|
||||||
|
|
||||||
|
if (spanIndex == -1) {
|
||||||
|
// nothing to end
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const span = r.telemetry.splice(spanIndex, 1)[0];
|
||||||
|
|
||||||
|
if (r.telemetry.length >= 1) {
|
||||||
|
// Assume span now at index is the parent
|
||||||
|
const parentSpan = r.telemetry[spanIndex];
|
||||||
|
if (parentSpan) {
|
||||||
|
span.resourceSpans[0].scopeSpans[0].spans[0].parentSpanId =
|
||||||
|
parentSpan.resourceSpans[0].scopeSpans[0].spans[0].spanId;
|
||||||
|
} else {
|
||||||
|
console.debug(name + " has no parentSpan");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
span.resourceSpans[0].scopeSpans[0].spans[0].endTimeUnixNano =
|
||||||
|
"" + Date.now() * 1000000;
|
||||||
|
|
||||||
|
span.resourceSpans[0].scopeSpans[0].spans[0].attributes.push({
|
||||||
|
key: "answers",
|
||||||
|
value: {
|
||||||
|
stringValue: JSON.stringify(r.answers),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const response = await traces.post(`/v1/traces`, span, {
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return response.data;
|
||||||
|
} catch (e) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user