From 6710cddaa4e027dde6ba42cb771f82726dce9077 Mon Sep 17 00:00:00 2001
From: Trent Mick <trentm@gmail.com>
Date: Mon, 25 Apr 2022 21:00:16 -0700
Subject: [PATCH] feat(ConsoleSpanExporter): export span links (#2917)

* feat(ConsoleSpanExporter): export span links

* test: update test case for change to console.dir

* chore: changelog entry
---
 CHANGELOG.md                                  |  2 ++
 .../src/export/ConsoleSpanExporter.ts         |  3 ++-
 .../common/export/ConsoleSpanExporter.test.ts | 27 ++++++++++++++-----
 3 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index b0e23d98076..68c62f2a7f6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@ All notable changes to this project will be documented in this file.
 
 ### :rocket: (Enhancement)
 
+* feat(ConsoleSpanExporter): export span links [#2917](https://github.com/open-telemetry/opentelemetry-js/pull/2917) @trentm
+
 ### :bug: (Bug Fix)
 
 ### :books: (Refine Doc)
diff --git a/packages/opentelemetry-sdk-trace-base/src/export/ConsoleSpanExporter.ts b/packages/opentelemetry-sdk-trace-base/src/export/ConsoleSpanExporter.ts
index 60f803c5d08..57baa62d3a1 100644
--- a/packages/opentelemetry-sdk-trace-base/src/export/ConsoleSpanExporter.ts
+++ b/packages/opentelemetry-sdk-trace-base/src/export/ConsoleSpanExporter.ts
@@ -65,6 +65,7 @@ export class ConsoleSpanExporter implements SpanExporter {
       attributes: span.attributes,
       status: span.status,
       events: span.events,
+      links: span.links
     };
   }
 
@@ -78,7 +79,7 @@ export class ConsoleSpanExporter implements SpanExporter {
     done?: (result: ExportResult) => void
   ): void {
     for (const span of spans) {
-      console.log(this._exportInfo(span));
+      console.dir(this._exportInfo(span), { depth: 3 });
     }
     if (done) {
       return done({ code: ExportResultCode.SUCCESS });
diff --git a/packages/opentelemetry-sdk-trace-base/test/common/export/ConsoleSpanExporter.test.ts b/packages/opentelemetry-sdk-trace-base/test/common/export/ConsoleSpanExporter.test.ts
index 8e5e40adfb9..0a66b13fc2a 100644
--- a/packages/opentelemetry-sdk-trace-base/test/common/export/ConsoleSpanExporter.test.ts
+++ b/packages/opentelemetry-sdk-trace-base/test/common/export/ConsoleSpanExporter.test.ts
@@ -14,6 +14,10 @@
  * limitations under the License.
  */
 
+import {
+  SpanContext,
+  TraceFlags,
+} from '@opentelemetry/api';
 import { AlwaysOnSampler } from '@opentelemetry/core';
 import * as assert from 'assert';
 import * as sinon from 'sinon';
@@ -26,16 +30,16 @@ import {
 /* eslint-disable no-console */
 describe('ConsoleSpanExporter', () => {
   let consoleExporter: ConsoleSpanExporter;
-  let previousConsoleLog: any;
+  let previousConsoleDir: any;
 
   beforeEach(() => {
-    previousConsoleLog = console.log;
-    console.log = () => {};
+    previousConsoleDir = console.dir;
+    console.dir = () => {};
     consoleExporter = new ConsoleSpanExporter();
   });
 
   afterEach(() => {
-    console.log = previousConsoleLog;
+    console.dir = previousConsoleDir;
   });
 
   describe('.export()', () => {
@@ -46,14 +50,22 @@ describe('ConsoleSpanExporter', () => {
         });
         consoleExporter = new ConsoleSpanExporter();
 
-        const spyConsole = sinon.spy(console, 'log');
+        const spyConsole = sinon.spy(console, 'dir');
         const spyExport = sinon.spy(consoleExporter, 'export');
 
         basicTracerProvider.addSpanProcessor(
           new SimpleSpanProcessor(consoleExporter)
         );
 
-        const span = basicTracerProvider.getTracer('default').startSpan('foo');
+        const tracer = basicTracerProvider.getTracer('default');
+        const context: SpanContext = {
+          traceId: 'a3cda95b652f4a1592b449d5929fda1b',
+          spanId: '5e0c63257de34c92',
+          traceFlags: TraceFlags.SAMPLED,
+        };
+        const span = tracer.startSpan('foo', {
+          links: [ { context, attributes: { anAttr: 'aValue' } } ]
+        });
         span.addEvent('foobar');
         span.end();
 
@@ -70,6 +82,7 @@ describe('ConsoleSpanExporter', () => {
           'events',
           'id',
           'kind',
+          'links',
           'name',
           'parentId',
           'status',
@@ -80,7 +93,7 @@ describe('ConsoleSpanExporter', () => {
         assert.ok(firstSpan.name === 'foo');
         assert.ok(firstEvent.name === 'foobar');
         assert.ok(consoleSpan.id === firstSpan.spanContext().spanId);
-        assert.ok(keys === expectedKeys);
+        assert.ok(keys === expectedKeys, 'expectedKeys');
 
         assert.ok(spyExport.calledOnce);
       });