Skip to main content

Metis log collector for FastAPI and SQLAlchemy

Project description

Metis FastAPI SQLAlchemy log collector

About

This library logs the HTTP requests created by FastAPI and SQLAlchemy with the SQL commands they generate. The library can also collect the execution plan for deeper analysis.

The log records stored in a local file. Future versions will allow saving the log records directly to log collectors such as DataDog, Logz.io and Splunk.

The log can be analyzed using our Visual Studio Code extension

Technical

This library uses OpenTelemetry to instrument both FastAPI and SQLAlchemy.

Tested on python 3.8.9, FastAPI 0.78.0, SQLAlchemy 1.4.33, PostgreSQL 12 or higher.

Instrumentation

Installation:

pip install fastapialchemycollector

Instrumentation:

  • Configure the destination file name

  • Configure logging the execution plan

By default the package only logs the SQL commands and the estimated execution plan (PlanCollectType.ESTIMATED).

The library:

  1. Logs the estimated execution plan by running the SQL command using
    EXPLAIN ( VERBOSE, COSTS, SUMMARY, FORMAT JSON)
    
  2. Runs the SQL command.

Logging the estimated plan has an impact on performances but usually, in a dev environment who doesn't run a large number of SQL commands, the impact is very low, around 3%.

Warning! Do NOT run the code in Production! An environment variable should prevent the package from collecting the estimated execution plan in Production.

The library can be configured using PlanCollectType.NONE to log only the SQL Commands while the execution plans, estimated or actual, will be calculated later using our platform.

  • Using Metis platform with Apikey:
import os
from sqlalchemy import create_engine
from fastapi import FastAPI
from fastapialchemycollector import setup, MetisInstrumentor, PlanCollectType

# existing app initialization
app = FastAPI()
engine = create_engine(os.environ['DATABASE_URI'])

# To start collecting the logs:
instrumentation: MetisInstrumentor = setup('<SERVICE_NAME>',
                                           api_key='<API_KEY>',
                                           service_version='<SERVICE_VERSION>',
                                           plan_collection_option=PlanCollectType.ESTIMATED, #optional
                                           dsn="https://ingest.metisdata.io/") #optional

instrumentation.instrument_app(app, engine)
  • Using local file:
import os
from sqlalchemy import create_engine
from fastapi import FastAPI
from fastapialchemycollector import setup, MetisInstrumentor, PlanCollectType

# existing app initialization
app = FastAPI()
engine = create_engine(os.environ['DATABASE_URI'])

# By default, the package logs the SQL commands and their execution plan.
# It can also be configured manually to collect only the SQL commands using PlanCollectType.NONE.
# We recommend collecting the estimated plan too.
optional_plan_collect_type = PlanCollectType.ESTIMATED

# To start collecting the logs:
instrumentation: MetisInstrumentor = setup('<SERVICE_NAME>',
                                           api_key='<API_KEY>',
                                           service_version='<SERVICE_VERSION>' #optional
                                           )

instrumentation.instrument_app(app, engine)

Set up your own tags:

You can assign metadata to your resources in the form of tags. Each tag is a label consisting of a user-defined key and value. Tags can help you manage, identify, organize, search for, and filter resources. You can create tags to categorize resources by purpose, owner, environment, or other criteria.

Define tags using environment variables:

METIS_TAG_<TAG_NAME>=""

export METIS_TAG_ENV=staging
export METIS_TAG_PR=$(git log -1 --format="%H")

Define tag using code:

Initialized setup with additional param called resource_tags

from fastapialchemycollector import setup, MetisInstrumentor

instrumentation: MetisInstrumentor = setup('<SERVICE_NAME>',
                                           api_key="<API_KEY>"
                                           ...,
                                           resource_tags={"pr": "staging"})

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastapialchemycollector-0.1.21.tar.gz (16.2 kB view details)

Uploaded Source

File details

Details for the file fastapialchemycollector-0.1.21.tar.gz.

File metadata

  • Download URL: fastapialchemycollector-0.1.21.tar.gz
  • Upload date:
  • Size: 16.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.15

File hashes

Hashes for fastapialchemycollector-0.1.21.tar.gz
Algorithm Hash digest
SHA256 5bf0383058c4690ec8c05130d56e459a7b7a51911b0227ec0a0ed1c81e030945
MD5 6a2f3f037a35a35642daee63b2c1fa93
BLAKE2b-256 1e71a59968c489d563228afd4b65ed16eaa14fb4758d2bb3e7d7d6e67eae942f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page