# jan-dyndor/text_api_and_grafana_observability architecture

> Architecture diagram of the GitHub repository jan-dyndor/text_api_and_grafana_observability, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/jan-dyndor/text_api_and_grafana_observability
- Repository: https://github.com/jan-dyndor/text_api_and_grafana_observability

## Overview

This is a small FastAPI text-processing service. A client submits validated text to the API, which normalizes it and either returns the cleaned text or computes analysis results and saves them to SQLite. The README also documents Prometheus metrics and a Loki/Grafana observability stack. The graph follows sampled application code and documented capabilities; observability wiring is represented only where the repository’s configuration paths support it.

Main entry points: [`src/simple_text_api/main.py`](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/main.py) (FastAPI endpoints), [`grafana/provisioning/datasources/datasources.yml`](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/grafana/provisioning/datasources/datasources.yml) (Grafana datasources), [`src/simple_text_api/services/clean_text.py`](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/services/clean_text.py) (Text cleaner), [`src/simple_text_api/db/database.py`](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/db/database.py) (DB session)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["API"]
  node_api["FastAPI endpoints<br/>[main.py]"]
  node_schemas["Request schemas<br/>[schemas.py]"]
end

subgraph group_processing["Text processing"]
  node_cleaner["Text cleaner<br/>[clean_text.py]"]
  node_analysis["Text analysis<br/>[text_analysis.py]"]
  node_config["Text and DB config<br/>[conf.py]"]
end

subgraph group_persistence["Persistence"]
  node_db_session["DB session<br/>[database.py]"]
  node_model["Analysis record<br/>[models.py]"]
  node_sqlite[("SQLite database")]
end

subgraph group_observability["Observability"]
  node_logger["Request logging<br/>[logging.py]"]
  node_prometheus["Prometheus<br/>[prometheus.yml]"]
  node_promtail["Promtail<br/>[promtail.yml]"]
  node_loki["Loki<br/>[loki.yml]"]
  node_grafana["Grafana dashboards<br/>[16110_rev4.json]"]
  node_grafana_sources["Grafana datasources<br/>[datasources.yml]"]
end

node_client(("API client"))

node_client -->|"sends request"| node_api
node_api -->|"validates input"| node_schemas
node_api -->|"cleans text"| node_cleaner
node_cleaner -->|"reads characters"| node_config
node_api -->|"computes counts"| node_analysis
node_api -->|"gets session"| node_db_session
node_api -->|"creates record"| node_model
node_db_session -->|"opens session"| node_sqlite
node_api -->|"commits result"| node_sqlite
node_api -->|"logs requests"| node_logger
node_prometheus -.->|"scrapes metrics"| node_api
node_promtail -.->|"ships logs"| node_loki
node_grafana_sources -.->|"configures datasource"| node_prometheus
node_grafana_sources -.->|"configures datasource"| node_loki
node_grafana -.->|"uses sources"| node_grafana_sources

click node_api "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/main.py"
click node_schemas "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/schemas/schemas.py"
click node_cleaner "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/services/clean_text.py"
click node_analysis "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/services/text_analysis.py"
click node_config "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/config/conf.py"
click node_db_session "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/db/database.py"
click node_model "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/db/models.py"
click node_logger "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/utils/logging.py"
click node_prometheus "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/prometheus.yml"
click node_promtail "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/promtail.yml"
click node_loki "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/loki.yml"
click node_grafana "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/grafana/dashboards/16110_rev4.json"
click node_grafana_sources "https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/grafana/provisioning/datasources/datasources.yml"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_api,node_schemas,node_client toneBlue
class node_cleaner,node_analysis,node_config toneAmber
class node_db_session,node_model,node_sqlite toneMint
class node_logger,node_prometheus,node_promtail,node_loki,node_grafana,node_grafana_sources toneRose
```

## Components

### API

- [FastAPI endpoints](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/main.py): `src/simple_text_api/main.py`
- [Request schemas](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/schemas/schemas.py): `src/simple_text_api/schemas/schemas.py`

### Text processing

- [Text cleaner](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/services/clean_text.py): `src/simple_text_api/services/clean_text.py`
- [Text analysis](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/services/text_analysis.py): `src/simple_text_api/services/text_analysis.py`
- [Text and DB config](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/config/conf.py): `src/simple_text_api/config/conf.py`

### Persistence

- [DB session](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/db/database.py): `src/simple_text_api/db/database.py`
- [Analysis record](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/db/models.py): `src/simple_text_api/db/models.py`
- **SQLite database**

### Observability

- [Request logging](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/src/simple_text_api/utils/logging.py): `src/simple_text_api/utils/logging.py`
- [Prometheus](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/prometheus.yml): `prometheus.yml`
- [Promtail](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/promtail.yml): `promtail.yml`
- [Loki](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/loki.yml): `loki.yml`
- [Grafana dashboards](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/grafana/dashboards/16110_rev4.json): `grafana/dashboards/16110_rev4.json`
- [Grafana datasources](https://github.com/jan-dyndor/text_api_and_grafana_observability/blob/main/grafana/provisioning/datasources/datasources.yml): `grafana/provisioning/datasources/datasources.yml`

### Other components

- **API client**

## Connections

- API client → FastAPI endpoints: sends request
- FastAPI endpoints → Request schemas: validates input
- FastAPI endpoints → Text cleaner: cleans text
- Text cleaner → Text and DB config: reads characters
- FastAPI endpoints → Text analysis: computes counts
- FastAPI endpoints → DB session: gets session
- FastAPI endpoints → Analysis record: creates record
- DB session → SQLite database: opens session
- FastAPI endpoints → SQLite database: commits result
- FastAPI endpoints → Request logging: logs requests
- Prometheus → FastAPI endpoints: scrapes metrics
- Promtail → Loki: ships logs
- Grafana datasources → Prometheus: configures datasource
- Grafana datasources → Loki: configures datasource
- Grafana dashboards → Grafana datasources: uses sources
