Files
semantic-kernel/python/semantic_kernel/functions/kernel_function_log_messages.py
T
Tao Chen 6680b2e356 Python: Add metrics instrumentation (#8317)
### Motivation and Context

<!-- Thank you for your contribution to the semantic-kernel repo!
Please help reviewers and future users, providing the following
information:
  1. Why is this change required?
  2. What problem does it solve?
  3. What scenario does it contribute to?
  4. If it fixes an open issue, please link to the issue here.
-->
We very recently added instrumentation to kernel functions:
https://github.com/microsoft/semantic-kernel/pull/8280. That PR added
logs and traces for observing a kernel function. This PR adds metrics
and modifies the telemetry sample app to show how to export metric
instruments to Application Insights.

### Description

<!-- Describe your changes, the overall approach, the underlying design.
These notes will help understanding how your code works. Thanks! -->
1. Kernel function now produces metrics data for observability.
2. Add code to export metric instruments to the telemetry sample.
3. Add Google AI as a second service to the telemetry sample to show
case nested spans.
4. Mics optimizations.


![image](https://github.com/user-attachments/assets/141e9bd2-06b2-4399-a913-f8aeb12aa8af)


![image](https://github.com/user-attachments/assets/fd35ad84-c59f-418c-b9e6-84beb4b22eb1)


![image](https://github.com/user-attachments/assets/1f40fac0-23fa-4b3e-b6c9-644e654c0cbd)


### Contribution Checklist

<!-- Before submitting this PR, please make sure: -->

- [x] The code builds clean without any errors or warnings
- [x] The PR follows the [SK Contribution
Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md)
and the [pre-submission formatting
script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts)
raises no violations
- [x] All unit tests pass, and I have added new tests where possible
- [x] I didn't break anyone 😄
2024-08-22 15:34:28 +00:00

64 lines
2.5 KiB
Python

# Copyright (c) Microsoft. All rights reserved.
import logging
from logging import Logger
from semantic_kernel.functions.function_result import FunctionResult
from semantic_kernel.functions.kernel_arguments import KernelArguments
class KernelFunctionLogMessages:
"""Kernel function log messages.
This class contains static methods to log messages related to kernel functions.
"""
@staticmethod
def log_function_invoking(logger: Logger, kernel_function_name: str):
"""Log message when a kernel function is invoked."""
logger.info("Function %s invoking.", kernel_function_name)
@staticmethod
def log_function_arguments(logger: Logger, arguments: KernelArguments):
"""Log message when a kernel function is invoked."""
logger.debug("Function arguments: %s", arguments)
@staticmethod
def log_function_invoked_success(logger: Logger, kernel_function_name: str):
"""Log message when a kernel function is invoked successfully."""
logger.info("Function %s succeeded.", kernel_function_name)
@staticmethod
def log_function_result_value(logger: Logger, function_result: FunctionResult | None):
"""Log message when a kernel function result is returned."""
if not logger.isEnabledFor(logging.DEBUG):
return
if function_result is not None:
try:
logger.debug("Function result: %s", function_result)
except Exception:
logger.error("Function result: Failed to convert result value to string")
else:
logger.debug("Function result: None")
@staticmethod
def log_function_error(logger: Logger, error: Exception):
"""Log message when a kernel function fails."""
logger.error("Function failed. Error: %s", error)
@staticmethod
def log_function_completed(logger: Logger, duration: float):
"""Log message when a kernel function is completed."""
logger.info("Function completed. Duration: %fs", duration)
@staticmethod
def log_function_streaming_invoking(logger: Logger, kernel_function_name: str):
"""Log message when a kernel function is invoked via streaming."""
logger.info("Function %s streaming.", kernel_function_name)
@staticmethod
def log_function_streaming_completed(logger: Logger, duration: float):
"""Log message when a kernel function is completed via streaming."""
logger.info("Function streaming completed. Duration: %fs", duration)