Sources/Trace/SLSTraceFeature.m (185 lines of code) (raw):

// // SLSTraceFeature.m // Pods // // Created by gordon on 2022/9/13. // #import "SLSTraceFeature.h" #import "SLSSdkSender.h" #import "SLSTracer+Internal.h" #import "SLSURLSessionInstrumentation.h" #import "LogProducerConfig.h" #import "SLSHttpHeader.h" @class SLSTraceSender; #pragma mark - SLS Trace Sender @interface SLSTraceSender : SLSSdkSender @property(nonatomic, strong) SLSSdkFeature *feature; + (instancetype) sender: (SLSCredentials *) credentials feature: (SLSSdkFeature *) feature; - (instancetype) initWithFeature: (SLSSdkFeature *) feature; @end @interface SLSTraceLogSender : SLSTraceSender + (instancetype) sender: (SLSCredentials *) credentials feature: (SLSSdkFeature *) feature; @end #pragma mark - SLS Trace Feature @interface SLSTraceFeature () @property(nonatomic, strong) SLSTraceSender *sender; @property(nonatomic, strong) SLSTraceLogSender *logsSender; @end @implementation SLSTraceFeature - (instancetype)init { self = [super init]; if (self) { } return self; } - (NSString *)name { return @"trace"; } - (void)onInitialize:(SLSCredentials *)credentials configuration:(SLSConfiguration *)configuration { _sender = [SLSTraceSender sender: credentials feature: self]; [SLSTracer setTraceFeature:self]; [SLSTracer setSpanProvider:configuration.spanProvider]; [SLSTracer setSpanProcessor:(id<SLSSpanProcessorProtocol>) _sender]; if (configuration.enableInstrumentNSURLSession) { [SLSURLSessionInstrumentation inject]; } if (configuration.enableTraceLogs) { _logsSender = [SLSTraceLogSender sender:credentials feature:self]; } } - (SLSSpanBuilder *)newSpanBuilder:(NSString *)spanName provider:(id<SLSSpanProviderProtocol>)provider processor:(id<SLSSpanProcessorProtocol>)processor { return [[SLSSpanBuilder builder] initWithName:spanName provider:self.configuration.spanProvider processor:(id<SLSSpanProcessorProtocol>) _sender ]; } - (void)setCredentials:(SLSCredentials *)credentials { if (nil == credentials.traceCredentials) { [credentials createTraceCredentials]; } [_sender setCredentials:credentials]; [_logsSender setCredentials:credentials]; } - (void) setCallback:(CredentialsCallback)callback { [_sender setCallback:callback]; [_logsSender setCallback:callback]; } - (BOOL) addLog:(Log *)log { if (nil == log || nil == _logsSender) { return NO; } return [_logsSender send: log]; } @end #pragma mark - SLS Trace Sender @interface SLSTraceSender() + (instancetype) sender: (SLSCredentials *) credentials feature: (SLSSdkFeature *) feature; - (instancetype) initWithFeature: (SLSSdkFeature *) feature; @end @implementation SLSTraceSender + (instancetype)sender:(SLSCredentials *)credentials feature:(SLSSdkFeature *)feature { SLSTraceSender *sender = [[SLSTraceSender alloc] initWithFeature:feature]; [sender initialize:credentials]; return sender; } - (instancetype)initWithFeature: (SLSSdkFeature *) feature { self = [super init]; if (self) { _feature = feature; } return self; } - (NSString *)provideFeatureName { return [_feature name]; } - (NSString *)provideLogFileName:(SLSCredentials *)credentials { return @"traces"; } - (NSString *)provideEndpoint:(SLSCredentials *)credentials { if (nil != credentials.traceCredentials && credentials.traceCredentials.endpoint.length > 0) { return credentials.traceCredentials.endpoint; } return [super provideEndpoint:credentials]; } - (NSString *)provideProjectName:(SLSCredentials *)credentials { if (nil != credentials.traceCredentials && credentials.traceCredentials.project.length > 0) { return credentials.traceCredentials.project; } return [super provideProjectName:credentials]; } - (NSString *)provideLogstoreName:(SLSCredentials *)credentials { if (nil != credentials.traceCredentials && credentials.traceCredentials.instanceId.length > 0) { return [NSString stringWithFormat:@"%@-traces", credentials.traceCredentials.instanceId]; } else { if (credentials.instanceId.length > 0) { return [NSString stringWithFormat:@"%@-traces", credentials.instanceId]; } else { return nil; } } } - (NSString *)provideAccessKeyId:(SLSCredentials *)credentials { if (nil != credentials.traceCredentials && credentials.traceCredentials.accessKeyId.length > 0) { return credentials.traceCredentials.accessKeyId; } return [super provideAccessKeyId:credentials]; } - (NSString *)provideAccessKeySecret:(SLSCredentials *)credentials { if (nil != credentials.traceCredentials && credentials.traceCredentials.accessKeySecret.length > 0) { return credentials.traceCredentials.accessKeySecret; } return [super provideAccessKeySecret:credentials]; } - (NSString *)provideSecurityToken:(SLSCredentials *)credentials { if (nil != credentials.traceCredentials && credentials.traceCredentials.securityToken.length > 0) { return credentials.traceCredentials.securityToken; } return [super provideSecurityToken:credentials]; } - (void) provideLogProducerConfig: (id) config { [config setHttpHeaderInjector:^NSArray<NSString *> *(NSArray<NSString *> *srcHeaders) { return [SLSHttpHeader getHeaders:srcHeaders, [NSString stringWithFormat:@"%@/%@", [self->_feature name], [self->_feature version]], nil]; }]; } @end #pragma mark - TraceLogSender @interface SLSTraceLogSender() @property(nonatomic, strong) SLSTraceLogSender *sender; @end @implementation SLSTraceLogSender + (instancetype) sender: (SLSCredentials *) credentials feature: (SLSSdkFeature *) feature { SLSTraceLogSender *sender = [[SLSTraceLogSender alloc] initWithFeature:feature]; [sender initialize:credentials]; return sender; } - (NSString *)provideFeatureName { return @"TraceLogs"; } - (NSString *)provideLogFileName:(SLSCredentials *)credentials { return @"traces_logs"; } - (NSString *)provideEndpoint:(SLSCredentials *)credentials { SLSLogsCredentials * logsCredentials = credentials.traceCredentials.logsCredentials; if (nil == logsCredentials || logsCredentials.endpoint.length == 0) { return [super provideEndpoint:credentials]; } return logsCredentials.endpoint; } - (NSString *)provideProjectName:(SLSCredentials *)credentials { SLSLogsCredentials * logsCredentials = credentials.traceCredentials.logsCredentials; if (nil == logsCredentials || logsCredentials.project.length == 0) { return [super provideProjectName:credentials]; } return logsCredentials.project; } - (NSString *)provideLogstoreName:(SLSCredentials *)credentials { SLSLogsCredentials * logsCredentials = credentials.traceCredentials.logsCredentials; if (nil == logsCredentials || logsCredentials.logstore.length == 0) { if (nil == credentials.traceCredentials || credentials.traceCredentials.instanceId.length == 0) { if (credentials.instanceId.length == 0) { return nil; } else { return [NSString stringWithFormat:@"%@-logs", credentials.instanceId]; } } else { return [NSString stringWithFormat:@"%@-logs", credentials.traceCredentials.instanceId]; } } return logsCredentials.logstore; } @end