Skip to content

Commit

Permalink
Add Prometheus metrics
Browse files Browse the repository at this point in the history
  • Loading branch information
Robin5605 committed Jul 19, 2023
1 parent 403f77d commit e124bbd
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 1 deletion.
12 changes: 11 additions & 1 deletion pdm.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ dependencies = [
"structlog>=23.1.0",
"asgi-correlation-id>=4.2.0",
"sentry-sdk[fastapi]>=1.25.1",
"prometheus-client>=0.17.1",
]
dynamic = ["version"]

Expand Down
14 changes: 14 additions & 0 deletions src/mainframe/endpoints/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@
from mainframe.database import get_db
from mainframe.dependencies import validate_token
from mainframe.json_web_token import AuthenticationData
from mainframe.metrics import (
package_ingest_counter,
package_scan_fail_counter,
package_scan_success_counter,
package_scanned_counter,
)
from mainframe.models.orm import DownloadURL, Rule, Scan, Status
from mainframe.models.schemas import (
Error,
Expand Down Expand Up @@ -41,6 +47,8 @@ async def submit_results(
name = result.name
version = result.version

package_scanned_counter.inc()

scan = await session.scalar(
select(Scan).where(Scan.name == name).where(Scan.version == version).options(selectinload(Scan.rules))
)
Expand All @@ -64,6 +72,7 @@ async def submit_results(
if isinstance(result, PackageScanResultFail):
scan.status = Status.FAILED
scan.fail_reason = result.reason
package_scan_fail_counter.inc()

await session.commit()
return
Expand Down Expand Up @@ -100,6 +109,7 @@ async def submit_results(
tag="scan_submitted",
)

package_scan_success_counter.inc()
await session.commit()


Expand Down Expand Up @@ -210,6 +220,9 @@ async def batch_queue_package(
session.add(row)
except IntegrityError:
pass
else:
print("Incrementing!")
package_ingest_counter.inc()


@router.post(
Expand Down Expand Up @@ -268,6 +281,7 @@ async def queue_package(

try:
await session.commit()
package_ingest_counter.inc()
except IntegrityError:
await log.warn(f"Package {name}@{version} already queued for scanning.", tag="already_queued")
raise HTTPException(409, f"Package {name}@{version} is already queued for scanning")
Expand Down
2 changes: 2 additions & 0 deletions src/mainframe/endpoints/report.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from mainframe.database import get_db
from mainframe.dependencies import get_ms_graph_client, validate_token
from mainframe.json_web_token import AuthenticationData
from mainframe.metrics import package_scan_report_counter
from mainframe.models.orm import Scan
from mainframe.models.schemas import Error, PackageSpecifier
from mainframe.utils.mailer import send_email
Expand Down Expand Up @@ -228,4 +229,5 @@ async def report_package(

row.reported_by = auth.subject
row.reported_at = dt.datetime.now(dt.timezone.utc)
package_scan_report_counter.inc()
await session.commit()
9 changes: 9 additions & 0 deletions src/mainframe/metrics.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from prometheus_client import Counter, make_asgi_app # type: ignore

package_ingest_counter = Counter("packages_ingested", "Total amount of packages ingested so far")
package_scanned_counter = Counter("packages_scanned", "Total amount of packages scanned")
package_scan_success_counter = Counter("package_scan_success", "Total amount of packages successfully scanned")
package_scan_fail_counter = Counter("package_scan_fail", "Total amount of packages that failed while scanning")
package_scan_report_counter = Counter("package_scan_report", "Total amount of packages that have been reported")

metrics_app = make_asgi_app() # type: ignore
3 changes: 3 additions & 0 deletions src/mainframe/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from mainframe.database import async_session
from mainframe.dependencies import validate_token, validate_token_override
from mainframe.endpoints import routers
from mainframe.metrics import metrics_app # type: ignore
from mainframe.models.schemas import ServerMetadata
from mainframe.rules import Rules, fetch_rules

Expand Down Expand Up @@ -126,6 +127,8 @@ async def lifespan(app_: FastAPI):
version=__version__,
)

app.mount("/metrics", metrics_app) # type: ignore

if GIT_SHA in ("development", "testing"):
app.dependency_overrides[validate_token] = validate_token_override

Expand Down

0 comments on commit e124bbd

Please sign in to comment.