Add toString implementation to various log SDK components (#4979)
This commit is contained in:
		
							parent
							
								
									44975c2853
								
							
						
					
					
						commit
						c2947bf046
					
				|  | @ -80,12 +80,14 @@ public final class OpenTelemetrySdk implements OpenTelemetry { | ||||||
| 
 | 
 | ||||||
|   @Override |   @Override | ||||||
|   public String toString() { |   public String toString() { | ||||||
|     // TODO(anuraaga): Add logs / propagators |     // TODO(anuraaga): Add propagators | ||||||
|     return "OpenTelemetrySdk{" |     return "OpenTelemetrySdk{" | ||||||
|         + "tracerProvider=" |         + "tracerProvider=" | ||||||
|         + tracerProvider.unobfuscate() |         + tracerProvider.unobfuscate() | ||||||
|         + ", meterProvider=" |         + ", meterProvider=" | ||||||
|         + meterProvider.unobfuscate() |         + meterProvider.unobfuscate() | ||||||
|  |         + ", loggerProvider=" | ||||||
|  |         + loggerProvider | ||||||
|         + "}"; |         + "}"; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -19,6 +19,8 @@ import io.opentelemetry.context.propagation.ContextPropagators; | ||||||
| import io.opentelemetry.context.propagation.TextMapPropagator; | import io.opentelemetry.context.propagation.TextMapPropagator; | ||||||
| import io.opentelemetry.sdk.common.Clock; | import io.opentelemetry.sdk.common.Clock; | ||||||
| import io.opentelemetry.sdk.logs.SdkLoggerProvider; | import io.opentelemetry.sdk.logs.SdkLoggerProvider; | ||||||
|  | import io.opentelemetry.sdk.logs.export.LogRecordExporter; | ||||||
|  | import io.opentelemetry.sdk.logs.export.SimpleLogRecordProcessor; | ||||||
| import io.opentelemetry.sdk.metrics.Aggregation; | import io.opentelemetry.sdk.metrics.Aggregation; | ||||||
| import io.opentelemetry.sdk.metrics.InstrumentSelector; | import io.opentelemetry.sdk.metrics.InstrumentSelector; | ||||||
| import io.opentelemetry.sdk.metrics.InstrumentType; | import io.opentelemetry.sdk.metrics.InstrumentType; | ||||||
|  | @ -322,6 +324,8 @@ class OpenTelemetrySdkTest { | ||||||
|     when(spanExporter.toString()).thenReturn("MockSpanExporter{}"); |     when(spanExporter.toString()).thenReturn("MockSpanExporter{}"); | ||||||
|     when(metricExporter.getDefaultAggregation(any())).thenCallRealMethod(); |     when(metricExporter.getDefaultAggregation(any())).thenCallRealMethod(); | ||||||
|     when(metricExporter.toString()).thenReturn("MockMetricExporter{}"); |     when(metricExporter.toString()).thenReturn("MockMetricExporter{}"); | ||||||
|  |     LogRecordExporter logRecordExporter = mock(LogRecordExporter.class); | ||||||
|  |     when(logRecordExporter.toString()).thenReturn("MockLogRecordExporter{}"); | ||||||
|     Resource resource = |     Resource resource = | ||||||
|         Resource.builder().put(AttributeKey.stringKey("service.name"), "otel-test").build(); |         Resource.builder().put(AttributeKey.stringKey("service.name"), "otel-test").build(); | ||||||
|     OpenTelemetrySdk sdk = |     OpenTelemetrySdk sdk = | ||||||
|  | @ -341,6 +345,13 @@ class OpenTelemetrySdkTest { | ||||||
|                         InstrumentSelector.builder().setName("instrument").build(), |                         InstrumentSelector.builder().setName("instrument").build(), | ||||||
|                         View.builder().setName("new-instrument").build()) |                         View.builder().setName("new-instrument").build()) | ||||||
|                     .build()) |                     .build()) | ||||||
|  |             .setLoggerProvider( | ||||||
|  |                 SdkLoggerProvider.builder() | ||||||
|  |                     .setResource(resource) | ||||||
|  |                     .addLogRecordProcessor( | ||||||
|  |                         SimpleLogRecordProcessor.create( | ||||||
|  |                             LogRecordExporter.composite(logRecordExporter, logRecordExporter))) | ||||||
|  |                     .build()) | ||||||
|             .build(); |             .build(); | ||||||
| 
 | 
 | ||||||
|     assertThat(sdk.toString()) |     assertThat(sdk.toString()) | ||||||
|  | @ -359,6 +370,12 @@ class OpenTelemetrySdkTest { | ||||||
|                 + "resource=Resource{schemaUrl=null, attributes={service.name=\"otel-test\"}}, " |                 + "resource=Resource{schemaUrl=null, attributes={service.name=\"otel-test\"}}, " | ||||||
|                 + "metricReaders=[PeriodicMetricReader{exporter=MockMetricExporter{}, intervalNanos=60000000000}], " |                 + "metricReaders=[PeriodicMetricReader{exporter=MockMetricExporter{}, intervalNanos=60000000000}], " | ||||||
|                 + "views=[RegisteredView{instrumentSelector=InstrumentSelector{instrumentName=instrument}, view=View{name=new-instrument, aggregation=DefaultAggregation, attributesProcessor=NoopAttributesProcessor{}}}]" |                 + "views=[RegisteredView{instrumentSelector=InstrumentSelector{instrumentName=instrument}, view=View{name=new-instrument, aggregation=DefaultAggregation, attributesProcessor=NoopAttributesProcessor{}}}]" | ||||||
|  |                 + "}, " | ||||||
|  |                 + "loggerProvider=SdkLoggerProvider{" | ||||||
|  |                 + "clock=SystemClock{}, " | ||||||
|  |                 + "resource=Resource{schemaUrl=null, attributes={service.name=\"otel-test\"}}, " | ||||||
|  |                 + "logLimits=LogLimits{maxNumberOfAttributes=128, maxAttributeValueLength=2147483647}, " | ||||||
|  |                 + "logRecordProcessor=SimpleLogRecordProcessor{logRecordExporter=MultiLogRecordExporter{logRecordExporters=[MockLogRecordExporter{}, MockLogRecordExporter{}]}}" | ||||||
|                 + "}" |                 + "}" | ||||||
|                 + "}"); |                 + "}"); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -117,4 +117,18 @@ public final class SdkLoggerProvider implements LoggerProvider, Closeable { | ||||||
|   public void close() { |   public void close() { | ||||||
|     shutdown().join(10, TimeUnit.SECONDS); |     shutdown().join(10, TimeUnit.SECONDS); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   public String toString() { | ||||||
|  |     return "SdkLoggerProvider{" | ||||||
|  |         + "clock=" | ||||||
|  |         + sharedState.getClock() | ||||||
|  |         + ", resource=" | ||||||
|  |         + sharedState.getResource() | ||||||
|  |         + ", logLimits=" | ||||||
|  |         + sharedState.getLogLimits() | ||||||
|  |         + ", logRecordProcessor=" | ||||||
|  |         + sharedState.getLogRecordProcessor() | ||||||
|  |         + '}'; | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -107,6 +107,20 @@ public final class BatchLogRecordProcessor implements LogRecordProcessor { | ||||||
|     return worker.batch; |     return worker.batch; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   @Override | ||||||
|  |   public String toString() { | ||||||
|  |     return "BatchLogRecordProcessor{" | ||||||
|  |         + "logRecordExporter=" | ||||||
|  |         + worker.logRecordExporter | ||||||
|  |         + ", scheduleDelayNanos=" | ||||||
|  |         + worker.scheduleDelayNanos | ||||||
|  |         + ", maxExportBatchSize=" | ||||||
|  |         + worker.maxExportBatchSize | ||||||
|  |         + ", exporterTimeoutNanos=" | ||||||
|  |         + worker.exporterTimeoutNanos | ||||||
|  |         + '}'; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   // Worker is a thread that batches multiple logs and calls the registered LogRecordExporter to |   // Worker is a thread that batches multiple logs and calls the registered LogRecordExporter to | ||||||
|   // export |   // export | ||||||
|   // the data. |   // the data. | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ package io.opentelemetry.sdk.logs.export; | ||||||
| import io.opentelemetry.sdk.common.CompletableResultCode; | import io.opentelemetry.sdk.common.CompletableResultCode; | ||||||
| import io.opentelemetry.sdk.logs.data.LogRecordData; | import io.opentelemetry.sdk.logs.data.LogRecordData; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
|  | import java.util.Arrays; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.logging.Level; | import java.util.logging.Level; | ||||||
|  | @ -24,6 +25,10 @@ final class MultiLogRecordExporter implements LogRecordExporter { | ||||||
| 
 | 
 | ||||||
|   private final LogRecordExporter[] logRecordExporters; |   private final LogRecordExporter[] logRecordExporters; | ||||||
| 
 | 
 | ||||||
|  |   private MultiLogRecordExporter(LogRecordExporter[] logRecordExporters) { | ||||||
|  |     this.logRecordExporters = logRecordExporters; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * Constructs and returns an instance of this class. |    * Constructs and returns an instance of this class. | ||||||
|    * |    * | ||||||
|  | @ -93,7 +98,11 @@ final class MultiLogRecordExporter implements LogRecordExporter { | ||||||
|     return CompletableResultCode.ofAll(results); |     return CompletableResultCode.ofAll(results); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   private MultiLogRecordExporter(LogRecordExporter[] logRecordExporters) { |   @Override | ||||||
|     this.logRecordExporters = logRecordExporters; |   public String toString() { | ||||||
|  |     return "MultiLogRecordExporter{" | ||||||
|  |         + "logRecordExporters=" | ||||||
|  |         + Arrays.toString(logRecordExporters) | ||||||
|  |         + '}'; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -104,4 +104,9 @@ public final class SimpleLogRecordProcessor implements LogRecordProcessor { | ||||||
|   public CompletableResultCode forceFlush() { |   public CompletableResultCode forceFlush() { | ||||||
|     return CompletableResultCode.ofAll(pendingExports); |     return CompletableResultCode.ofAll(pendingExports); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   public String toString() { | ||||||
|  |     return "SimpleLogRecordProcessor{" + "logRecordExporter=" + logRecordExporter + '}'; | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -346,4 +346,17 @@ class SdkLoggerProviderTest { | ||||||
|     assertThat(seenLogs.size()).isEqualTo(1); |     assertThat(seenLogs.size()).isEqualTo(1); | ||||||
|     assertThat(seenLogs.get(0).toLogRecordData().getEpochNanos()).isEqualTo(now); |     assertThat(seenLogs.get(0).toLogRecordData().getEpochNanos()).isEqualTo(now); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   @Test | ||||||
|  |   void toString_Valid() { | ||||||
|  |     when(logRecordProcessor.toString()).thenReturn("MockLogRecordProcessor"); | ||||||
|  |     assertThat(sdkLoggerProvider.toString()) | ||||||
|  |         .isEqualTo( | ||||||
|  |             "SdkLoggerProvider{" | ||||||
|  |                 + "clock=SystemClock{}, " | ||||||
|  |                 + "resource=Resource{schemaUrl=null, attributes={service.name=\"unknown_service:java\", telemetry.sdk.language=\"java\", telemetry.sdk.name=\"opentelemetry\", telemetry.sdk.version=\"1.21.0-SNAPSHOT\"}}, " | ||||||
|  |                 + "logLimits=LogLimits{maxNumberOfAttributes=128, maxAttributeValueLength=2147483647}, " | ||||||
|  |                 + "logRecordProcessor=MockLogRecordProcessor" | ||||||
|  |                 + "}"); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -420,6 +420,14 @@ class BatchLogRecordProcessorTest { | ||||||
|     assertThat(result.isSuccess()).isFalse(); |     assertThat(result.isSuccess()).isFalse(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   @Test | ||||||
|  |   void toString_Valid() { | ||||||
|  |     when(mockLogRecordExporter.toString()).thenReturn("MockLogRecordExporter"); | ||||||
|  |     assertThat(BatchLogRecordProcessor.builder(mockLogRecordExporter).build().toString()) | ||||||
|  |         .isEqualTo( | ||||||
|  |             "BatchLogRecordProcessor{logRecordExporter=MockLogRecordExporter, scheduleDelayNanos=200000000, maxExportBatchSize=512, exporterTimeoutNanos=30000000000}"); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   private static final class BlockingLogRecordExporter implements LogRecordExporter { |   private static final class BlockingLogRecordExporter implements LogRecordExporter { | ||||||
| 
 | 
 | ||||||
|     final Object monitor = new Object(); |     final Object monitor = new Object(); | ||||||
|  |  | ||||||
|  | @ -136,4 +136,13 @@ class MultiLogRecordExporterTest { | ||||||
|     verify(logRecordExporter1).shutdown(); |     verify(logRecordExporter1).shutdown(); | ||||||
|     verify(logRecordExporter2).shutdown(); |     verify(logRecordExporter2).shutdown(); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   @Test | ||||||
|  |   void toString_Valid() { | ||||||
|  |     when(logRecordExporter1.toString()).thenReturn("LogRecordExporter1"); | ||||||
|  |     when(logRecordExporter2.toString()).thenReturn("LogRecordExporter2"); | ||||||
|  |     assertThat(LogRecordExporter.composite(logRecordExporter1, logRecordExporter2).toString()) | ||||||
|  |         .isEqualTo( | ||||||
|  |             "MultiLogRecordExporter{logRecordExporters=[LogRecordExporter1, LogRecordExporter2]}"); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -119,4 +119,11 @@ class SimpleLogRecordProcessorTest { | ||||||
|     assertThat(shutdown.isSuccess()).isTrue(); |     assertThat(shutdown.isSuccess()).isTrue(); | ||||||
|     verify(logRecordExporter).shutdown(); |     verify(logRecordExporter).shutdown(); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   @Test | ||||||
|  |   void toString_Valid() { | ||||||
|  |     when(logRecordExporter.toString()).thenReturn("MockLogRecordExporter"); | ||||||
|  |     assertThat(logRecordProcessor.toString()) | ||||||
|  |         .isEqualTo("SimpleLogRecordProcessor{logRecordExporter=MockLogRecordExporter}"); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue