blob: f2de2fe6da4675559b2caa45311d98d1174e1349 [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.
//
use skywalking::{
logging::{
logger::Logger,
record::{LogRecord, RecordType},
},
proto::v3::{
log_data_body::Content, JsonLog, KeyStringValuePair, LogData, LogDataBody, LogTags,
TextLog, TraceContext,
},
reporter::{CollectItem, Report},
trace::{span::AbstractSpan, tracer::Tracer},
};
use std::{
collections::LinkedList,
sync::{Arc, Mutex},
};
#[test]
fn log() {
let reporter = Arc::new(MockReporter::default());
let logger = Logger::new("service_name", "instance_name", reporter.clone());
{
logger.log(LogRecord::new());
assert_eq!(
reporter.pop(),
LogData {
timestamp: 10,
service: "service_name".to_owned(),
service_instance: "instance_name".to_owned(),
body: Some(LogDataBody {
r#type: "".to_owned(),
content: Some(Content::Text(TextLog {
text: "".to_owned()
}))
}),
..Default::default()
}
);
}
{
logger.log(LogRecord::new().ignore_time());
assert_eq!(
reporter.pop(),
LogData {
timestamp: 0,
service: "service_name".to_owned(),
service_instance: "instance_name".to_owned(),
body: Some(LogDataBody {
r#type: "".to_owned(),
content: Some(Content::Text(TextLog {
text: "".to_owned()
}))
}),
..Default::default()
}
);
}
{
logger.log(
LogRecord::new()
.endpoint("endpoint")
.add_tag("foo", "foo")
.add_tags([("bar", "bar")])
.record_type(RecordType::Json)
.content(r#"{"content": "something to log"}"#),
);
assert_eq!(
reporter.pop(),
LogData {
timestamp: 10,
service: "service_name".to_owned(),
service_instance: "instance_name".to_owned(),
endpoint: "endpoint".to_owned(),
tags: Some(LogTags {
data: vec![
KeyStringValuePair {
key: "foo".to_owned(),
value: "foo".to_owned()
},
KeyStringValuePair {
key: "bar".to_owned(),
value: "bar".to_owned()
},
],
}),
body: Some(LogDataBody {
r#type: "".to_owned(),
content: Some(Content::Json(JsonLog {
json: r#"{"content": "something to log"}"#.to_owned()
}))
}),
..Default::default()
}
);
}
}
#[test]
fn integrate_trace() {
let reporter = Arc::new(MockReporter::default());
let tracer = Tracer::new("service_name", "instance_name", reporter.clone());
let logger = Logger::new("service_name", "instance_name", reporter.clone());
let mut ctx = tracer.create_trace_context();
let span = ctx.create_entry_span("operation_name");
logger.log(LogRecord::new().with_tracing_context(&ctx).with_span(&span));
assert_eq!(
reporter.pop(),
LogData {
timestamp: 10,
service: "service_name".to_owned(),
service_instance: "instance_name".to_owned(),
trace_context: Some(TraceContext {
trace_id: ctx.trace_id().to_owned(),
trace_segment_id: ctx.trace_segment_id().to_owned(),
span_id: span.span_id()
}),
body: Some(LogDataBody {
r#type: "".to_owned(),
content: Some(Content::Text(TextLog {
text: "".to_owned()
}))
}),
..Default::default()
}
);
}
#[derive(Default, Clone)]
struct MockReporter {
items: Arc<Mutex<LinkedList<LogData>>>,
}
impl MockReporter {
fn pop(&self) -> LogData {
self.items.try_lock().unwrap().pop_back().unwrap()
}
}
impl Report for MockReporter {
fn report(&self, item: CollectItem) {
match item {
CollectItem::Log(data) => {
self.items.try_lock().unwrap().push_back(*data);
}
_ => {}
}
}
}