Sources/OT/SLSSpanBuilder.m (135 lines of code) (raw):
//
// SLSSpanBuiler.m
// AliyunLogProducer
//
// Created by gordon on 2022/4/27.
//
#import "SLSSpanBuilder.h"
#import "SLSRecordableSpan.h"
#import "SLSIdGenerator.h"
#import "SLSTimeUtils.h"
#import "SLSContextManager.h"
@interface SLSSpanBuilder ()
@property(nonatomic, strong) NSString *name;
@property(nonatomic, strong) id<SLSSpanProcessorProtocol> spanProcessor;
@property(nonatomic, strong) id<SLSSpanProviderProtocol> spanProvider;
@property(nonatomic, strong, readonly) SLSSpan *parent;
@property(atomic, assign, readonly) BOOL active;
@property(nonnull, strong, readonly) SLSKind kind;
@property(nonatomic, strong) NSMutableArray<SLSAttribute*> *attributes;
@property(nonatomic, strong, readonly) SLSResource *resource;
@property(nonatomic, assign, readonly) long start;
@property(nonatomic, strong, readonly) NSString *service;
@property(atomic, assign, readonly) BOOL global;
@end
@implementation SLSSpanBuilder
+ (SLSSpanBuilder *) builder {
return [[SLSSpanBuilder alloc] init];
}
- (instancetype)init
{
self = [super init];
if (self) {
_attributes = [NSMutableArray<SLSAttribute*> array];
_start = 0L;
_kind = SLSCLIENT;
_global = YES;
}
return self;
}
- (SLSSpanBuilder *) initWithName: (NSString *)name provider: (id<SLSSpanProviderProtocol>) provider processor: (id<SLSSpanProcessorProtocol>) processor {
self = [self init];
if (self) {
_name = name;
_spanProcessor = processor;
_spanProvider = provider;
}
return self;
}
- (SLSSpanBuilder *) setParent: (SLSSpan *)parent {
_parent = parent;
return self;
}
- (SLSSpanBuilder *) setActive: (BOOL) active {
_active = active;
return self;
}
- (SLSSpanBuilder *) setKind: (SLSKind) kind {
_kind = kind;
return self;
}
- (SLSSpanBuilder *) addAttribute: (SLSAttribute *) attribute, ... NS_REQUIRES_NIL_TERMINATION {
[_attributes addObject:attribute];
va_list args;
SLSAttribute *arg;
va_start(args, attribute);
while ((arg = va_arg(args, SLSAttribute*))) {
[_attributes addObject:arg];
}
va_end(args);
return self;
}
- (SLSSpanBuilder *) addAttributes: (NSArray<SLSAttribute *> *) attributes {
[_attributes addObjectsFromArray:attributes];
return self;
}
- (SLSSpanBuilder *) setStart: (long) start {
_start = start;
return self;
}
- (SLSSpanBuilder *) addResource: (SLSResource *) resource {
_resource = resource;
return self;
}
- (SLSSpanBuilder *) setService: (NSString *)service {
_service = service;
return self;
}
- (SLSSpanBuilder *) setGlobal: (BOOL) global {
_global = global;
return self;
}
- (SLSSpan *) build {
SLSRecordableSpan *span = [[SLSRecordableSpan alloc] initWithSpanProcessor:_spanProcessor];
span.name = _name;
span.service = _service;
span.kind = _kind;
span.spanID = SLSIdGenerator.generateSpanId;
SLSSpan *parentSpan = nil;
if (nil != _parent) {
parentSpan = _parent;
} else {
parentSpan = [SLSContextManager activeSpan];
}
if (nil != parentSpan) {
span.traceID = parentSpan.traceID;
span.parentSpanID = parentSpan.spanID;
} else {
span.traceID = SLSIdGenerator.generateTraceId;
}
if (nil != _spanProvider) {
[_attributes addObjectsFromArray:[_spanProvider provideAttribute]];
}
NSMutableDictionary<NSString *, NSString *> *dict = (NSMutableDictionary<NSString *, NSString *> *) span.attribute;
for (SLSAttribute *attr in _attributes) {
if (attr.key && attr.value) {
[dict setObject:attr.value forKey:attr.key];
}
}
SLSResource *r = [SLSResource resource];
if (nil != _spanProvider) {
[r merge:[_spanProvider provideResource]];
}
if (nil != _resource) {
[r merge:_resource];
}
span.resource = r;
[span setGlobal: _global];
if (_start != 0L) {
span.start = _start;
} else {
span.start = SLSTimeUtils.now;
}
if (_active) {
[span setScope:[SLSContextManager makeCurrent:span]];
}
if (span.isGlobal) {
[SLSContextManager setGlobalActiveSpan:span];
}
return span;
}
@end