-
Notifications
You must be signed in to change notification settings - Fork 658
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add initial overall structure and classes for logs sdk #1894
Add initial overall structure and classes for logs sdk #1894
Conversation
from opentelemetry.sdk.logs import LogData | ||
|
||
|
||
class LogExportResult(enum.Enum): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this part of the spec?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, I think this will be eventually added to spec. Even I can send PR to get this ExportResult included in spec if you want.
def __init__( | ||
self, log_record: LogRecord, instrumentation_info: InstrumentationInfo, | ||
): | ||
self.log_record = log_record |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This might need to be read-only in the future. Could save for separate PR.
Please submit the PR to the |
b86348d
to
c0a11d3
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This PR looks great! It looks like there's a few TODOs left in the code, they look like they're documentation placeholders? If so, please add the documentation, otherwise if you could open an issue to track the work required that would be great.
|
||
|
||
class LogEmitter: | ||
# TODO: Add multi_log_processor |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please add documentation as to what a log emitter is
|
||
|
||
class LogEmitterProvider: | ||
# TODO: Add multi_log_processor |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ditto to documentation here.
True if all the log processors flushes the logs within timeout, | ||
False otherwise. | ||
""" | ||
# TODO: multi_log_processor.force_flush |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this TODO necessary here?
|
||
def shutdown(self): | ||
"""Shuts down the log processors.""" | ||
# TODO: multi_log_processor.shutdown |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this TODO necessary here?
|
||
The log processors are invoked in the same order they are registered. | ||
""" | ||
# TODO: multi_log_processor.add_log_processor. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this TODO necessary here?
""" | ||
|
||
@abc.abstractmethod | ||
def emit(self, log_data: LogData): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It would be nice if the SpanProcessor would also have a method called emit
for consistency. No action required from this comment, just a thought.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, what would emit
mean in the context of span?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would expect it to mean the same thing as in the context of logs and metrics, that we're emitting the data from the processor. Currently this is called "on_end" in the span processor.
@codeboten I added a comment on the original issue on the plan #1890 (comment). These TODOs are placeholders for actual implementation. |
Thanks for updating that issue, I think I'm still missing something. How is the following todo related to the LogEmitter?
|
""" | ||
|
||
|
||
class LogEmitter: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this a subclass of LogProcessor
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, I added a diagram below. I hope it helps.
), | ||
) | ||
|
||
def add_log_processor(self, log_processor: LogProcessor): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't this weird? I mean, this is a method of the LogEmitterProvider
class
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am not sure I understand your question. How else would we add a log processor?
I tried to make a diagram. I hope it clears up some doubts. LogEmitter sits between the logging library and SDK. It will have reference to an instance of MultiLogProcessor(yet to be implemented) from provider. LogEmitter will call |
I see, I think this is where my understanding is lacking... I was expecting the multilog processor interface to be the same as any other processor, the way a multi span processor's interface is the same as any span processor. So in this case I wouldnt expect a multi log processor change to impact the LogEmitter which is where this TODO is. |
Right, The TODO comment is to add multi_log_processor (which is missing as of now) so that LogEmitter can class LogEmitter:
def __init__(
self,
resource: Resource,
multi_log_processor: Union[SyncMultiLogProcessor, ConcurrenctMultiLogProcessor]
instrumentation_info: InstrumentationInfo,
):
self._resource = resource
self._multi_log_processor = multi_log_processor
self._instrumentation_info = instrumentation_info
def emit(self, record: LogRecord):
log_data = LogData(record, self._instrumentation_info)
self._multi_log_processor.emit(log_data)
def flush(self):
self._multi_log_processor.force_flush() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks @lonewolf3739 for talking through my comments, I understand the plan moving forward. This is really exciting work!
* Add initial overall structure and classes for logs sdk (#1894) * Add global LogEmitterProvider and convenience function get_log_emitter (#1901) * Add OTLPHandler for standard library logging module (#1903) * Add LogProcessors implementation (#1916) * Fix typos in test_handler.py (#1953) * Add support for OTLP Log exporter (#1943) * Add support for user defined attributes in OTLPHandler (#1952) * use timeout in force_flush (#2118) * use timeout in force_flush * fix lint * Update opentelemetry-sdk/src/opentelemetry/sdk/logs/export/__init__.py Co-authored-by: Srikanth Chekuri <[email protected]> * fix lint Co-authored-by: Srikanth Chekuri <[email protected]> * add a ConsoleExporter for logging (#2099) Co-authored-by: Srikanth Chekuri <[email protected]> * Update SDK docs and Add example with OTEL collector logging (debug) exporter (#2050) * Fix exception in severity number transformation (#2208) * Fix exception with warning message transformation * Fix lint * Fix lint * fstring * Demonstrate how to set the Resource for LogEmitterProvider (#2209) * Demonstrate how to set the Resource for LogEmitterProvider Added a Resource to the logs example to make it more complete. Previously it was using the built-in Resource. Now it adds the service.name and service.instance.id attributes. The resulting emitted log records look like this: ``` Resource labels: -> telemetry.sdk.language: STRING(python) -> telemetry.sdk.name: STRING(opentelemetry) -> telemetry.sdk.version: STRING(1.5.0) -> service.name: STRING(shoppingcart) -> service.instance.id: STRING(instance-12) InstrumentationLibraryLogs #0 InstrumentationLibrary __main__ 0.1 LogRecord #0 Timestamp: 2021-10-14 18:33:43.425820928 +0000 UTC Severity: ERROR ShortName: Body: Hyderabad, we have a major problem. Trace ID: ce1577e4a703f42d569e72593ad71888 Span ID: f8908ac4258ceff6 Flags: 1 ``` * Fix linting * Use batch processor in example (#2225) * move logs to _logs (#2240) * move logs to _logs * fix lint * move log_exporter to _log_exporter as it's still experimental (#2252) Co-authored-by: Srikanth Chekuri <[email protected]> Co-authored-by: Adrian Garcia Badaracco <[email protected]> Co-authored-by: Leighton Chen <[email protected]> Co-authored-by: Tigran Najaryan <[email protected]> Co-authored-by: Owais Lone <[email protected]>
Description
This commit adds initial structure and classes based on the OTEP https://github.com/open-telemetry/oteps/blob/main/text/logs/0150-logging-library-sdk.md#specification
Part of #1890