blob: 7d974140b59a100f59f01307c05fdc040361cc22 [file]
/*!
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import Span from '../../trace/span/Span';
import ID from '../../trace/ID';
import NewID from '../../trace/NewID';
import SegmentRef from '../../trace/context/SegmentRef';
import config from '../../config/AgentConfig';
import { KeyStringValuePair } from '../../proto/common/Common_pb';
import { Log, RefType, SegmentObject, SegmentReference, SpanObject } from '../../proto/language-agent/Tracing_pb';
export default class Segment {
segmentId = new ID();
spans: Span[] = [];
relatedTraces: ID[] = [new NewID()];
references: SegmentRef[] = [];
archive(span: Span): void {
this.spans.push(span);
}
relate(id: ID) {
if (this.relatedTraces[0] instanceof NewID) {
this.relatedTraces.shift();
}
if (!this.relatedTraces.includes(id)) {
this.relatedTraces.push(id);
}
}
refer(ref: SegmentRef): this {
if (!this.references.includes(ref)) {
this.references.push(ref);
}
return this;
}
/** Convert to gRPC SegmentObject (Java TraceSegment.transform). */
transform(): SegmentObject {
return new SegmentObject()
.setService(config.serviceName)
.setServiceinstance(config.serviceInstance)
.setTraceid(this.relatedTraces[0].toString())
.setTracesegmentid(this.segmentId.toString())
.setSpansList(
this.spans.map((span) =>
new SpanObject()
.setSpanid(span.id)
.setParentspanid(span.parentId)
.setStarttime(span.startTime)
.setEndtime(span.endTime)
.setOperationname(span.operation)
.setPeer(span.peer)
.setSpantype(span.type)
.setSpanlayer(span.layer)
.setComponentid(span.component.id)
.setIserror(span.errored)
.setLogsList(
span.logs.map((log) =>
new Log()
.setTime(log.timestamp)
.setDataList(
log.items.map((logItem) => new KeyStringValuePair().setKey(logItem.key).setValue(logItem.val)),
),
),
)
.setTagsList(span.tags.map((tag) => new KeyStringValuePair().setKey(tag.key).setValue(tag.val)))
.setRefsList(
span.refs.map((ref) =>
new SegmentReference()
.setReftype(RefType.CROSSPROCESS)
.setTraceid(ref.traceId.toString())
.setParenttracesegmentid(ref.segmentId.toString())
.setParentspanid(ref.spanId)
.setParentservice(ref.service)
.setParentserviceinstance(ref.serviceInstance)
.setNetworkaddressusedatpeer(ref.clientAddress),
),
),
),
);
}
}