blob: 2acdd6804ec9590671b7a42342b1a4ad4d419c65 [file] [log] [blame]
# 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.
require 'base64'
require_relative 'carrier_item'
module Skywalking
module Tracing
class Carrier < CarrierItem
attr_reader :trace_id, :correlation_carrier, :service_instance,
:endpoint, :segment_id, :span_id,
:peer, :items, :iter_index, :service
def initialize(
trace_id: '',
segment_id: '',
span_id: '',
service: '',
service_instance: '',
endpoint: '',
peer: '',
correlation: nil
)
super(key: 'sw8')
@trace_id = trace_id
@segment_id = segment_id
@span_id = span_id
@service = service
@service_instance = service_instance
@endpoint = endpoint
@peer = peer
@correlation_carrier = SW8CorrelationCarrier.new
@items = [@correlation_carrier, self]
@iter_index = 0
@correlation_carrier.correlation = correlation unless correlation.nil?
end
def value
[
'1',
Base64.strict_encode64(@trace_id),
Base64.strict_encode64(@segment_id),
@span_id,
Base64.strict_encode64(@service),
Base64.strict_encode64(@service_instance),
Base64.strict_encode64(@endpoint),
Base64.strict_encode64(@peer)
].join('-')
end
def value=(val)
@val = val
return if val.nil? || val.empty?
parts = val.split('-')
return if parts.size != 8
@trace_id = Base64.strict_decode64(parts[1])
@segment_id = Base64.strict_decode64(parts[2])
@span_id = parts[3]
@service = Base64.strict_decode64(parts[4])
@service_instance = Base64.strict_decode64(parts[5])
@endpoint = Base64.strict_decode64(parts[6])
@peer = Base64.strict_decode64(parts[7])
end
def valid?
!@trace_id.empty? && !@segment_id.empty? && !@service.empty? &&
!@service_instance.empty? && !@endpoint.empty? &&
!@peer.empty? && @span_id.match?(/^\d+$/)
end
def suppressed?
@val && !valid?
end
def each
@items.each { |item| yield item }
end
end
class SW8CorrelationCarrier < CarrierItem
attr_accessor :correlation
def initialize
super(key: 'sw8-correlation')
@correlation = {}
end
def value
return '' if @correlation.nil? || @correlation.empty?
@correlation.map { |k, v| "#{Base64.strict_encode64(k)}:#{Base64.strict_encode64(v)}" }.join(',')
end
def value=(val)
@val = val
return if val.nil? || val.empty?
val.split(',').each do |per|
parts = per.split(':')
next if parts.size != 2
@correlation[Base64.strict_decode64(parts[0])] = Base64.strict_decode64(parts[1])
end
end
end
end
end