nthlayer-generate 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nthlayer_generate-1.0.0/PKG-INFO +392 -0
- nthlayer_generate-1.0.0/README.md +346 -0
- nthlayer_generate-1.0.0/pyproject.toml +138 -0
- nthlayer_generate-1.0.0/setup.cfg +4 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/__init__.py +5 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/alertmanager/__init__.py +24 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/alertmanager/config.py +265 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/alerts/__init__.py +17 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/alerts/loader.py +206 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/alerts/models.py +190 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/alerts/validator.py +258 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/__init__.py +52 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/alerts.py +374 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/apply.py +289 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/backstage.py +121 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/dashboard.py +148 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/dashboard_validate.py +219 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/dependencies.py +151 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/docs.py +122 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/environments.py +473 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/__init__.py +114 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/json_fmt.py +71 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/junit.py +134 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/markdown.py +173 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/models.py +80 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/formatters/sarif.py +273 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/generate.py +97 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/generate_alerts.py +128 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/generate_loki.py +139 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/identity.py +586 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/init.py +490 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/lint.py +99 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/migrate.py +188 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/ownership.py +306 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/pagerduty.py +183 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/plan.py +254 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/recommend_metrics.py +395 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/recording_rules.py +126 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/setup.py +594 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/simulate.py +332 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/slo.py +429 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/templates.py +68 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/topology.py +232 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/ux.py +398 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/validate.py +132 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/validate_metadata.py +184 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/validate_slo.py +512 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/cli/validate_spec.py +154 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/clients/__init__.py +6 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/clients/base.py +19 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/clients/cortex.py +9 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/clients/pagerduty.py +9 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/clients/slack.py +11 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/config/__init__.py +54 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/config/cli.py +545 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/config/integrations.py +367 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/config/loader.py +311 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/config/secrets/__init__.py +490 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/config/secrets/backends.py +430 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/config/settings.py +78 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/core/__init__.py +45 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/core/errors.py +54 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/core/tiers.py +32 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/__init__.py +55 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/builder_sdk.py +717 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/intents.py +711 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/manifest_builder.py +190 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/models.py +257 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/panel_spec.py +467 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/resolver.py +372 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/sdk_adapter.py +497 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/__init__.py +179 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/base.py +52 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/base_intent.py +341 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/consul_intent.py +92 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/elasticsearch_intent.py +170 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/etcd_intent.py +98 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/haproxy_intent.py +106 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/http_intent.py +127 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/kafka_intent.py +74 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/kubernetes.py +273 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/mongodb_intent.py +75 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/mysql_intent.py +93 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/nats_intent.py +91 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/nginx_intent.py +117 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/postgresql_intent.py +208 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/pulsar_intent.py +91 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/rabbitmq_intent.py +114 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/redis_intent.py +161 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/stream_intent.py +114 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/traefik_intent.py +95 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/templates/worker_intent.py +114 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dashboards/validator.py +214 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/demo.py +1243 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/__init__.py +40 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/discovery.py +484 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/models.py +24 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/__init__.py +48 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/backstage.py +466 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/base.py +135 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/consul.py +517 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/etcd.py +359 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/kubernetes.py +682 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/prometheus.py +371 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/dependencies/providers/zookeeper.py +398 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/discovery/__init__.py +19 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/discovery/classifier.py +108 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/discovery/client.py +268 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/discovery/models.py +61 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/domain/__init__.py +3 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/domain/models.py +24 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/generators/__init__.py +23 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/generators/alerts.py +322 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/generators/backstage.py +304 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/generators/docs.py +619 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/generators/sloth.py +468 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/__init__.py +47 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/models.py +15 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/normalizer.py +23 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership.py +23 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/__init__.py +27 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/backstage.py +11 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/base.py +15 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/codeowners.py +161 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/declared.py +98 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/kubernetes.py +11 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/ownership_providers/pagerduty.py +11 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/identity/resolver.py +11 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/integrations/__init__.py +10 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/integrations/pagerduty.py +338 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/logging.py +33 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/loki/__init__.py +27 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/loki/generator.py +405 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/loki/models.py +83 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/loki/templates.py +883 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/__init__.py +31 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/discovery.py +145 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/models.py +143 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/recommender.py +256 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/runtime/__init__.py +61 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/runtime/go.py +72 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/runtime/jvm.py +114 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/runtime/nodejs.py +73 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/runtime/python.py +63 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/standards/__init__.py +10 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/standards/aliases.py +140 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/standards/otel_semconv.py +108 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/__init__.py +14 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/api.py +130 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/cache.py +103 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/database_client.py +109 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/gateway.py +138 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/grpc.py +120 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/queue_consumer.py +116 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/registry.py +113 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/metrics/templates/worker.py +101 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/__init__.py +23 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/engine.py +57 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/handlers.py +500 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/plan_builder.py +33 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/registry.py +63 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/orchestration/results.py +67 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/orchestrator.py +239 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/pagerduty/__init__.py +36 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/pagerduty/defaults.py +279 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/pagerduty/naming.py +124 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/pagerduty/orchestration.py +310 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/pagerduty/resources.py +689 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/policies/__init__.py +7 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/policies/engine.py +70 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/policies/models.py +66 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/policies/rules.py +144 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/providers/__init__.py +16 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/providers/__main__.py +4 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/providers/base.py +23 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/providers/cli.py +81 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/providers/grafana.py +21 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/providers/lock.py +19 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/providers/mimir.py +19 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/providers/pagerduty.py +17 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/providers/prometheus.py +17 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/providers/registry.py +25 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/recording_rules/__init__.py +23 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/recording_rules/builder.py +365 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/recording_rules/manifest_builder.py +634 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/recording_rules/models.py +100 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/__init__.py +36 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/engine.py +577 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/graph.py +64 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/models.py +247 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/output.py +97 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/simulate/what_if.py +93 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/slos/__init__.py +53 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/slos/alerts.py +444 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/slos/calculator.py +300 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/slos/ceiling.py +244 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/slos/dependencies.py +365 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/slos/models.py +24 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/slos/parser.py +167 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/slos/pipeline.py +255 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/__init__.py +41 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/alerting.py +216 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/builtin_templates/__init__.py +1 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/contracts.py +181 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/custom_templates.py +104 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/environment_alerts.py +198 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/environment_detection.py +204 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/environment_gates.py +149 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/environment_merger.py +152 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/environments.py +198 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/helpers.py +94 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/loader.py +570 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/manifest.py +827 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/models.py +168 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/opensrm_parser.py +670 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/parser.py +270 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/template.py +96 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/template_loader.py +94 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/templates.py +72 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/validator.py +263 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/specs/variable_substitution.py +116 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/topology/__init__.py +33 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/topology/enrichment.py +147 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/topology/models.py +108 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/topology/serializers.py +162 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/user_config.py +107 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/validation/__init__.py +75 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/validation/conftest.py +505 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/validation/metadata.py +660 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/validation/promql.py +342 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate/validation/promruval.py +293 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/PKG-INFO +392 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/SOURCES.txt +341 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/dependency_links.txt +1 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/entry_points.txt +3 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/requires.txt +46 -0
- nthlayer_generate-1.0.0/src/nthlayer_generate.egg-info/top_level.txt +1 -0
- nthlayer_generate-1.0.0/tests/test_alert_pipeline.py +369 -0
- nthlayer_generate-1.0.0/tests/test_alerting_config.py +408 -0
- nthlayer_generate-1.0.0/tests/test_alertmanager.py +214 -0
- nthlayer_generate-1.0.0/tests/test_alerts.py +719 -0
- nthlayer_generate-1.0.0/tests/test_backstage_generator.py +476 -0
- nthlayer_generate-1.0.0/tests/test_budget_policy.py +188 -0
- nthlayer_generate-1.0.0/tests/test_cli_alerts.py +357 -0
- nthlayer_generate-1.0.0/tests/test_cli_apply.py +880 -0
- nthlayer_generate-1.0.0/tests/test_cli_dashboard.py +331 -0
- nthlayer_generate-1.0.0/tests/test_cli_dashboard_validate.py +554 -0
- nthlayer_generate-1.0.0/tests/test_cli_environments.py +545 -0
- nthlayer_generate-1.0.0/tests/test_cli_formatters.py +645 -0
- nthlayer_generate-1.0.0/tests/test_cli_generate.py +257 -0
- nthlayer_generate-1.0.0/tests/test_cli_generate_alerts.py +255 -0
- nthlayer_generate-1.0.0/tests/test_cli_generate_loki.py +413 -0
- nthlayer_generate-1.0.0/tests/test_cli_identity.py +316 -0
- nthlayer_generate-1.0.0/tests/test_cli_lint.py +244 -0
- nthlayer_generate-1.0.0/tests/test_cli_pagerduty.py +369 -0
- nthlayer_generate-1.0.0/tests/test_cli_plan.py +330 -0
- nthlayer_generate-1.0.0/tests/test_cli_setup.py +944 -0
- nthlayer_generate-1.0.0/tests/test_cli_slo.py +956 -0
- nthlayer_generate-1.0.0/tests/test_cli_templates.py +191 -0
- nthlayer_generate-1.0.0/tests/test_cli_ux.py +730 -0
- nthlayer_generate-1.0.0/tests/test_cli_validate.py +271 -0
- nthlayer_generate-1.0.0/tests/test_cli_validate_metadata.py +260 -0
- nthlayer_generate-1.0.0/tests/test_cli_validate_slo.py +261 -0
- nthlayer_generate-1.0.0/tests/test_cli_validate_spec.py +544 -0
- nthlayer_generate-1.0.0/tests/test_clients.py +69 -0
- nthlayer_generate-1.0.0/tests/test_config_cli.py +991 -0
- nthlayer_generate-1.0.0/tests/test_config_loader.py +691 -0
- nthlayer_generate-1.0.0/tests/test_config_secrets_backends.py +857 -0
- nthlayer_generate-1.0.0/tests/test_config_secrets_init.py +861 -0
- nthlayer_generate-1.0.0/tests/test_conftest_validation.py +360 -0
- nthlayer_generate-1.0.0/tests/test_contract_validation.py +777 -0
- nthlayer_generate-1.0.0/tests/test_core_errors.py +207 -0
- nthlayer_generate-1.0.0/tests/test_core_tiers.py +200 -0
- nthlayer_generate-1.0.0/tests/test_critical_models.py +111 -0
- nthlayer_generate-1.0.0/tests/test_custom_templates.py +307 -0
- nthlayer_generate-1.0.0/tests/test_dashboard_generation.py +292 -0
- nthlayer_generate-1.0.0/tests/test_dashboard_templates.py +355 -0
- nthlayer_generate-1.0.0/tests/test_dashboards_builder_sdk.py +1017 -0
- nthlayer_generate-1.0.0/tests/test_dashboards_models.py +825 -0
- nthlayer_generate-1.0.0/tests/test_dashboards_resolver.py +565 -0
- nthlayer_generate-1.0.0/tests/test_dashboards_validator.py +497 -0
- nthlayer_generate-1.0.0/tests/test_demo.py +1130 -0
- nthlayer_generate-1.0.0/tests/test_demo_app_auth.py +70 -0
- nthlayer_generate-1.0.0/tests/test_dependencies.py +267 -0
- nthlayer_generate-1.0.0/tests/test_deps_discovery.py +356 -0
- nthlayer_generate-1.0.0/tests/test_deps_provider_backstage.py +454 -0
- nthlayer_generate-1.0.0/tests/test_deps_provider_consul.py +657 -0
- nthlayer_generate-1.0.0/tests/test_deps_provider_etcd.py +692 -0
- nthlayer_generate-1.0.0/tests/test_deps_provider_kubernetes.py +538 -0
- nthlayer_generate-1.0.0/tests/test_deps_provider_zookeeper.py +640 -0
- nthlayer_generate-1.0.0/tests/test_discovery_client.py +896 -0
- nthlayer_generate-1.0.0/tests/test_docs_generator.py +422 -0
- nthlayer_generate-1.0.0/tests/test_domain_models.py +162 -0
- nthlayer_generate-1.0.0/tests/test_env_flag.py +195 -0
- nthlayer_generate-1.0.0/tests/test_environment_commands.py +467 -0
- nthlayer_generate-1.0.0/tests/test_generators_alerts.py +159 -0
- nthlayer_generate-1.0.0/tests/test_generators_backstage.py +133 -0
- nthlayer_generate-1.0.0/tests/test_generators_docs.py +129 -0
- nthlayer_generate-1.0.0/tests/test_generators_sloth.py +182 -0
- nthlayer_generate-1.0.0/tests/test_hybrid_dashboard_builder.py +243 -0
- nthlayer_generate-1.0.0/tests/test_identity.py +437 -0
- nthlayer_generate-1.0.0/tests/test_init.py +569 -0
- nthlayer_generate-1.0.0/tests/test_integrations_pagerduty.py +220 -0
- nthlayer_generate-1.0.0/tests/test_intent_templates.py +292 -0
- nthlayer_generate-1.0.0/tests/test_loki.py +257 -0
- nthlayer_generate-1.0.0/tests/test_metadata_validation.py +422 -0
- nthlayer_generate-1.0.0/tests/test_metrics_discovery.py +208 -0
- nthlayer_generate-1.0.0/tests/test_metrics_recommender.py +506 -0
- nthlayer_generate-1.0.0/tests/test_mimir_provider.py +184 -0
- nthlayer_generate-1.0.0/tests/test_multi_environment_integration.py +458 -0
- nthlayer_generate-1.0.0/tests/test_opensrm.py +2507 -0
- nthlayer_generate-1.0.0/tests/test_orchestrator.py +1077 -0
- nthlayer_generate-1.0.0/tests/test_ownership.py +506 -0
- nthlayer_generate-1.0.0/tests/test_pagerduty.py +192 -0
- nthlayer_generate-1.0.0/tests/test_pagerduty_module.py +259 -0
- nthlayer_generate-1.0.0/tests/test_pagerduty_orchestration.py +483 -0
- nthlayer_generate-1.0.0/tests/test_pagerduty_resources.py +736 -0
- nthlayer_generate-1.0.0/tests/test_policy_engine.py +249 -0
- nthlayer_generate-1.0.0/tests/test_policy_handler.py +184 -0
- nthlayer_generate-1.0.0/tests/test_policy_models.py +140 -0
- nthlayer_generate-1.0.0/tests/test_policy_rules.py +367 -0
- nthlayer_generate-1.0.0/tests/test_prometheus_provider.py +415 -0
- nthlayer_generate-1.0.0/tests/test_provider_grafana.py +88 -0
- nthlayer_generate-1.0.0/tests/test_provider_pagerduty.py +88 -0
- nthlayer_generate-1.0.0/tests/test_providers_lock.py +187 -0
- nthlayer_generate-1.0.0/tests/test_recording_rules.py +428 -0
- nthlayer_generate-1.0.0/tests/test_sdk_adapter.py +730 -0
- nthlayer_generate-1.0.0/tests/test_simulate_cli.py +31 -0
- nthlayer_generate-1.0.0/tests/test_simulate_engine.py +133 -0
- nthlayer_generate-1.0.0/tests/test_simulate_graph.py +77 -0
- nthlayer_generate-1.0.0/tests/test_simulate_models.py +186 -0
- nthlayer_generate-1.0.0/tests/test_simulate_what_if.py +75 -0
- nthlayer_generate-1.0.0/tests/test_slo_alerts.py +518 -0
- nthlayer_generate-1.0.0/tests/test_slo_ceiling.py +522 -0
- nthlayer_generate-1.0.0/tests/test_slo_cli.py +317 -0
- nthlayer_generate-1.0.0/tests/test_slos.py +987 -0
- nthlayer_generate-1.0.0/tests/test_specs.py +384 -0
- nthlayer_generate-1.0.0/tests/test_sync_awesome_alerts.py +439 -0
- nthlayer_generate-1.0.0/tests/test_templates.py +332 -0
- nthlayer_generate-1.0.0/tests/test_topology.py +430 -0
- nthlayer_generate-1.0.0/tests/test_user_config.py +234 -0
- nthlayer_generate-1.0.0/tests/test_validation.py +193 -0
- nthlayer_generate-1.0.0/tests/test_validation_promruval.py +515 -0
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nthlayer-generate
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: NthLayer - The Missing Layer of Reliability
|
|
5
|
+
Requires-Python: >=3.11
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: nthlayer-common>=0.1.5
|
|
8
|
+
Requires-Dist: grafana-foundation-sdk>=0.0.11
|
|
9
|
+
Requires-Dist: pydantic<3.0.0,>=2.7.0
|
|
10
|
+
Requires-Dist: pydantic-settings<3.0.0,>=2.2.1
|
|
11
|
+
Requires-Dist: httpx<0.29.0,>=0.27.0
|
|
12
|
+
Requires-Dist: pagerduty<7.0.0,>=6.0.0
|
|
13
|
+
Requires-Dist: structlog<25.0.0,>=24.1.0
|
|
14
|
+
Requires-Dist: pyyaml<7.0.0,>=6.0.1
|
|
15
|
+
Requires-Dist: rich<15.0.0,>=13.7.0
|
|
16
|
+
Requires-Dist: rich-argparse<2.0.0,>=1.4.0
|
|
17
|
+
Requires-Dist: questionary<3.0.0,>=2.0.0
|
|
18
|
+
Requires-Dist: cachetools<7.0.0,>=5.3.0
|
|
19
|
+
Requires-Dist: opentelemetry-semantic-conventions>=0.60b1
|
|
20
|
+
Provides-Extra: dev
|
|
21
|
+
Requires-Dist: pytest<10.0.0,>=8.2.0; extra == "dev"
|
|
22
|
+
Requires-Dist: pytest-asyncio<2.0.0,>=0.23.0; extra == "dev"
|
|
23
|
+
Requires-Dist: pytest-cov<8.0.0,>=5.0.0; extra == "dev"
|
|
24
|
+
Requires-Dist: respx<0.23.0,>=0.21.0; extra == "dev"
|
|
25
|
+
Requires-Dist: ruff<0.15.0,>=0.4.0; extra == "dev"
|
|
26
|
+
Requires-Dist: mypy<1.20.0,>=1.10.0; extra == "dev"
|
|
27
|
+
Requires-Dist: types-requests>=2.31.0; extra == "dev"
|
|
28
|
+
Requires-Dist: types-python-dateutil>=2.8.19; extra == "dev"
|
|
29
|
+
Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
|
|
30
|
+
Requires-Dist: anyio<5.0.0,>=4.3.0; extra == "dev"
|
|
31
|
+
Requires-Dist: kubernetes<36.0.0,>=28.0.0; extra == "dev"
|
|
32
|
+
Provides-Extra: docs
|
|
33
|
+
Requires-Dist: mkdocs-material>=9.5.0; extra == "docs"
|
|
34
|
+
Requires-Dist: mkdocs-minify-plugin>=0.8.0; extra == "docs"
|
|
35
|
+
Provides-Extra: kubernetes
|
|
36
|
+
Requires-Dist: kubernetes<36.0.0,>=28.0.0; extra == "kubernetes"
|
|
37
|
+
Provides-Extra: zookeeper
|
|
38
|
+
Requires-Dist: kazoo<3.0.0,>=2.9.0; extra == "zookeeper"
|
|
39
|
+
Provides-Extra: etcd
|
|
40
|
+
Requires-Dist: etcd3<1.0.0,>=0.12.0; extra == "etcd"
|
|
41
|
+
Provides-Extra: service-discovery
|
|
42
|
+
Requires-Dist: kazoo<3.0.0,>=2.9.0; extra == "service-discovery"
|
|
43
|
+
Requires-Dist: etcd3<1.0.0,>=0.12.0; extra == "service-discovery"
|
|
44
|
+
Provides-Extra: aws
|
|
45
|
+
Requires-Dist: boto3<2.0.0,>=1.34.0; extra == "aws"
|
|
46
|
+
|
|
47
|
+
<div align="center">
|
|
48
|
+
<a href="https://github.com/rsionnach/nthlayer">
|
|
49
|
+
<img src="presentations/public/nthlayer_dark_banner.png" alt="NthLayer" width="400">
|
|
50
|
+
</a>
|
|
51
|
+
<br><br>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
# NthLayer
|
|
55
|
+
|
|
56
|
+
**Reliability as code. Pure compiler.**
|
|
57
|
+
|
|
58
|
+
Define reliability requirements in a manifest. Generate dashboards, alerts, SLOs, and documentation β deterministically, every time.
|
|
59
|
+
|
|
60
|
+
[](https://github.com/rsionnach/nthlayer)
|
|
61
|
+
[](https://pypi.org/project/nthlayer/)
|
|
62
|
+
[](LICENSE.txt)
|
|
63
|
+
[](https://github.com/samber/awesome-prometheus-alerts)
|
|
64
|
+
|
|
65
|
+
## TL;DR
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
pip install nthlayer
|
|
69
|
+
nthlayer init
|
|
70
|
+
nthlayer apply service.yaml
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## β οΈ The Problem
|
|
76
|
+
|
|
77
|
+
Reliability decisions happen too late. Teams set SLOs in isolation, deploy without checking error budgets, and discover missing metrics during incidents. Dashboards are inconsistent. Alerts are copy-pasted. Nobody validates whether a 99.99% target is even achievable given dependencies.
|
|
78
|
+
|
|
79
|
+
## π‘ The Solution
|
|
80
|
+
|
|
81
|
+
NthLayer is a **pure compiler** for reliability infrastructure. Write a manifest, get artifacts:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
service.yaml β validate β apply
|
|
85
|
+
β β
|
|
86
|
+
β βββ Grafana dashboards, Prometheus alerts,
|
|
87
|
+
β recording rules, SLOs, PagerDuty config,
|
|
88
|
+
β Backstage entities, service docs
|
|
89
|
+
β
|
|
90
|
+
βββ SLO feasible? Dependencies support it? Metrics exist?
|
|
91
|
+
Policies pass? Ceiling valid?
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
NthLayer generates. The [nthlayer-workers](https://github.com/rsionnach/nthlayer-workers) runtime (Tier 2) enforces, observes, and responds at runtime, with state held in [nthlayer-core](https://github.com/rsionnach/nthlayer-core) (Tier 1) and operator interaction via [nthlayer-bench](https://github.com/rsionnach/nthlayer-bench) (Tier 3).
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## β‘ Core Features
|
|
99
|
+
|
|
100
|
+
### Artifact Generation
|
|
101
|
+
|
|
102
|
+
Generate dashboards, alerts, and SLOs from a single spec.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
$ nthlayer apply service.yaml
|
|
106
|
+
|
|
107
|
+
Generated:
|
|
108
|
+
β dashboard.json (Grafana)
|
|
109
|
+
β alerts.yaml (Prometheus)
|
|
110
|
+
β recording-rules.yaml (Prometheus)
|
|
111
|
+
β slos.yaml (OpenSLO)
|
|
112
|
+
β backstage.json (Backstage entity)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Dependency-Aware SLO Validation
|
|
116
|
+
|
|
117
|
+
Your SLO ceiling is your weakest dependency chain. NthLayer calculates it.
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
$ nthlayer validate-slo payment-api
|
|
121
|
+
|
|
122
|
+
Target: 99.99% availability
|
|
123
|
+
Dependencies:
|
|
124
|
+
β postgresql (99.95%)
|
|
125
|
+
β redis (99.99%)
|
|
126
|
+
β user-service (99.9%)
|
|
127
|
+
|
|
128
|
+
Serial availability: 99.84%
|
|
129
|
+
β INFEASIBLE: Target exceeds dependency ceiling by 0.15%
|
|
130
|
+
|
|
131
|
+
Recommendation: Reduce target to 99.8% or improve user-service SLO
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Metric Recommendations
|
|
135
|
+
|
|
136
|
+
Enforce OpenTelemetry conventions. Know what's missing before production.
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
$ nthlayer recommend-metrics payment-api
|
|
140
|
+
|
|
141
|
+
Required (SLO-critical):
|
|
142
|
+
β http.server.request.duration FOUND
|
|
143
|
+
β http.server.active_requests MISSING
|
|
144
|
+
|
|
145
|
+
Run with --show-code for instrumentation examples.
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Monte Carlo SLO Simulation
|
|
149
|
+
|
|
150
|
+
Model failure scenarios before they happen.
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
$ nthlayer simulate service.yaml --scenarios 10000
|
|
154
|
+
|
|
155
|
+
Monte Carlo Simulation (10,000 runs)
|
|
156
|
+
SLO: availability β₯ 99.9%
|
|
157
|
+
Result: 94.2% of scenarios meet target
|
|
158
|
+
P50 availability: 99.95%
|
|
159
|
+
P99 availability: 99.82%
|
|
160
|
+
Risk: 5.8% chance of SLO breach in 30d window
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Topology Export
|
|
164
|
+
|
|
165
|
+
Export dependency graphs for correlation engines.
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
$ nthlayer topology export service.yaml --format json
|
|
169
|
+
$ nthlayer topology export service.yaml --format mermaid
|
|
170
|
+
$ nthlayer topology export service.yaml --format dot
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Policy Validation
|
|
174
|
+
|
|
175
|
+
Enforce organizational standards at build time.
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
$ nthlayer validate service.yaml --policies policies.yaml
|
|
179
|
+
|
|
180
|
+
β required_fields: ownership.runbook present
|
|
181
|
+
β tier_constraint: critical services require deployment gates
|
|
182
|
+
β dependency_rule: all critical deps have SLOs
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## π Quick Start
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# Install
|
|
191
|
+
pip install nthlayer
|
|
192
|
+
|
|
193
|
+
# Create a service spec
|
|
194
|
+
nthlayer init
|
|
195
|
+
|
|
196
|
+
# Validate and generate
|
|
197
|
+
nthlayer apply service.yaml
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Minimal `service.yaml`
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
name: payment-api
|
|
204
|
+
tier: critical
|
|
205
|
+
type: api
|
|
206
|
+
team: payments
|
|
207
|
+
|
|
208
|
+
dependencies:
|
|
209
|
+
- postgresql
|
|
210
|
+
- redis
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
NthLayer also supports the [OpenSRM format](https://rsionnach.github.io/nthlayer/concepts/opensrm/) (`apiVersion: opensrm/v1`) for contracts, deployment gates, and more. See [full spec reference](https://rsionnach.github.io/nthlayer/reference/service-yaml/) for all options.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## π CI/CD Integration
|
|
218
|
+
|
|
219
|
+
```yaml
|
|
220
|
+
# GitHub Actions
|
|
221
|
+
- name: Validate reliability
|
|
222
|
+
run: |
|
|
223
|
+
nthlayer validate service.yaml
|
|
224
|
+
nthlayer validate-slo service.yaml
|
|
225
|
+
nthlayer apply service.yaml --output-dir generated/
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
For runtime enforcement (deployment gates, drift detection, error budget checks), use [`nthlayer-workers`](https://github.com/rsionnach/nthlayer-workers) β the runtime tier:
|
|
229
|
+
|
|
230
|
+
```yaml
|
|
231
|
+
- name: Gate deployment
|
|
232
|
+
run: |
|
|
233
|
+
nthlayer-workers gate --service payment-api
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
The runtime tier reads SLOs and dependency declarations from the same OpenSRM manifests this generator consumes. Verdicts and assessments flow through [`nthlayer-core`](https://github.com/rsionnach/nthlayer-core)'s HTTP API.
|
|
237
|
+
|
|
238
|
+
Works with: **GitHub Actions**, **GitLab CI**, **ArgoCD**, **Tekton**, **Jenkins**
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## π― How It's Different
|
|
243
|
+
|
|
244
|
+
| Traditional Approach | NthLayer |
|
|
245
|
+
|---------------------|----------|
|
|
246
|
+
| Set SLOs in isolation | Validate against dependency chains |
|
|
247
|
+
| Manual dashboard creation | Generate from spec |
|
|
248
|
+
| Copy-paste alerts | 593+ alert templates, auto-selected |
|
|
249
|
+
| Discover missing metrics in incidents | Enforce before deployment |
|
|
250
|
+
| "Is this ready?" = opinion | "Is this ready?" = deterministic check |
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## π Documentation
|
|
255
|
+
|
|
256
|
+
**[Full Documentation](https://rsionnach.github.io/nthlayer/)** - Comprehensive guides and reference.
|
|
257
|
+
|
|
258
|
+
[](https://deepwiki.com/rsionnach/nthlayer)
|
|
259
|
+
|
|
260
|
+
| Guide | Description |
|
|
261
|
+
|-------|-------------|
|
|
262
|
+
| [Quick Start](https://rsionnach.github.io/nthlayer/getting-started/quick-start/) | Get running in 5 minutes |
|
|
263
|
+
| [Dependency Discovery](https://rsionnach.github.io/nthlayer/features/dependencies/) | Automatic dependency mapping |
|
|
264
|
+
| [CI/CD Integration](https://rsionnach.github.io/nthlayer/guides/cicd/) | Pipeline setup |
|
|
265
|
+
| [CLI Reference](https://rsionnach.github.io/nthlayer/reference/cli/) | All commands |
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## πΊοΈ Roadmap
|
|
270
|
+
|
|
271
|
+
### Generate (this repo)
|
|
272
|
+
- [x] Artifact generation (dashboards, alerts, SLOs, recording rules, Loki alerts)
|
|
273
|
+
- [x] Dependency-aware SLO validation
|
|
274
|
+
- [x] Metric recommendations (OpenTelemetry conventions)
|
|
275
|
+
- [x] Monte Carlo SLO simulation
|
|
276
|
+
- [x] Policy validation (build-time)
|
|
277
|
+
- [x] Topology export (JSON, Mermaid, DOT)
|
|
278
|
+
- [x] OpenSRM manifest format (`opensrm/v1`)
|
|
279
|
+
- [x] Identity resolution & ownership
|
|
280
|
+
- [x] Backstage entity generation
|
|
281
|
+
- [x] Service documentation generation
|
|
282
|
+
- [x] CI/CD GitHub Action
|
|
283
|
+
- [ ] Agentic inference (`nthlayer infer`)
|
|
284
|
+
- [ ] MCP server integration
|
|
285
|
+
- [ ] Backstage plugin
|
|
286
|
+
|
|
287
|
+
### Runtime tier ([nthlayer-workers](https://github.com/rsionnach/nthlayer-workers))
|
|
288
|
+
|
|
289
|
+
What was previously the standalone `nthlayer-observe` repo plus four agentic components is now consolidated into a single Tier-2 worker process with five modules:
|
|
290
|
+
|
|
291
|
+
- [x] **observe** β SLO collection, drift detection, dependency/topology discovery, deploy gate
|
|
292
|
+
- [x] **measure** β judgment SLO evaluation, governance ratchet, autonomy-level reduction
|
|
293
|
+
- [x] **correlate** β session-window event correlation, topology drift, contract divergence
|
|
294
|
+
- [x] **respond** β incident response coordinator (situation-shaped triggers, capture-at-write-time escalation)
|
|
295
|
+
- [x] **learn** β outcome resolution, calibration signals, retrospective generation
|
|
296
|
+
|
|
297
|
+
Backed by [nthlayer-core](https://github.com/rsionnach/nthlayer-core) (Tier 1: HTTP API, verdict store, case management, manifest catalogue) and operated via [nthlayer-bench](https://github.com/rsionnach/nthlayer-bench) (Tier 3: Textual TUI for SREs).
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Agentic Inference (Planned)
|
|
302
|
+
|
|
303
|
+
`nthlayer infer` will use a model to analyse a codebase and propose an OpenSRM manifest for it. The model examines the code, identifies services, infers appropriate SLO targets, and generates a draft `service.reliability.yaml` that NthLayer then validates and generates artifacts from.
|
|
304
|
+
|
|
305
|
+
This follows the **Zero Framework Cognition** boundary applied across the OpenSRM ecosystem: the model provides judgment (what SLOs does this service need?), and NthLayer provides transport (validate the manifest, generate the monitoring artifacts). Clean boundary between reasoning and deterministic transformation. Architectural context: [opensrm/docs/superpowers/](https://github.com/rsionnach/opensrm/tree/main/docs/superpowers).
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## OpenSRM Ecosystem
|
|
310
|
+
|
|
311
|
+
NthLayer is one piece of a six-repo ecosystem. The architecture has three runtime tiers; this repo (`nthlayer-generate`) sits outside the runtime tiers as a build-time compiler, feeding manifests forward.
|
|
312
|
+
|
|
313
|
+
```
|
|
314
|
+
ββββββββββββββββββββββββββββ
|
|
315
|
+
β OpenSRM Manifest β
|
|
316
|
+
β (the shared contract) β
|
|
317
|
+
ββββββββββββββ¬ββββββββββββββ
|
|
318
|
+
β
|
|
319
|
+
ββββββββββββββββββ΄βββββββββββββββββ
|
|
320
|
+
βΌ βΌ
|
|
321
|
+
ββββββββββββββββββββ βββββββββββββββββββ
|
|
322
|
+
β nthlayer-generateβ β nthlayer-core β
|
|
323
|
+
β (build-time) β β (Tier 1) β
|
|
324
|
+
β β β HTTP API Β· β
|
|
325
|
+
β specs β Grafana, β β verdict store Β· β
|
|
326
|
+
β Prometheus, SLOs,β β case mgmt Β· β
|
|
327
|
+
β Backstage, docs β β manifests β
|
|
328
|
+
ββββββββββ¬ββββββββββ ββββββββββ²βββββββββ
|
|
329
|
+
β β HTTP only
|
|
330
|
+
β deployed ββββββββββ΄βββββββββββββββ
|
|
331
|
+
βΌ β β
|
|
332
|
+
ββββββββββββββββββββ ββββββββββ΄βββββββββ βββββββββββ΄βββββββββ
|
|
333
|
+
β Live infra β β nthlayer-workersβ β nthlayer-bench β
|
|
334
|
+
β (Prometheus, β obs β (Tier 2) β β (Tier 3) β
|
|
335
|
+
β Grafana, etc.) β ββββββ β β Textual TUI for β
|
|
336
|
+
ββββββββββββββββββββ β observeΒ·measure β β SREs: situation β
|
|
337
|
+
β correlateΒ·respondβ β board, case β
|
|
338
|
+
β Β·learn β β bench, approvals β
|
|
339
|
+
βββββββββββββββββββ ββββββββββββββββββββ
|
|
340
|
+
|
|
341
|
+
Learning loop:
|
|
342
|
+
workers.learn retrospectives β manifest updates β nthlayer-generate
|
|
343
|
+
regenerates β workers refine thresholds β operators ratify in bench
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
**How nthlayer-generate fits in:**
|
|
347
|
+
|
|
348
|
+
- Reads OpenSRM manifests and emits the monitoring infrastructure (Prometheus rules, Grafana dashboards, recording rules, Backstage entities, service docs) that the runtime tier and live observability stack rely on
|
|
349
|
+
- Pure compiler β deterministic, stateless, no LLM, no runtime side effects
|
|
350
|
+
- Verdicts and assessments produced by `nthlayer-workers` modules emit OTel side-effects (`gen_ai.decision.*`, `gen_ai.override.*`) that flow into Prometheus; this generator can be configured to produce dashboards for those metrics alongside service dashboards
|
|
351
|
+
- Exports service topology that `workers.correlate` uses for topology-aware signal correlation
|
|
352
|
+
- Post-incident retrospectives produced by `workers.learn` feed back into manifest updates that regenerate via this compiler β closing the loop
|
|
353
|
+
|
|
354
|
+
Each component works alone. Someone who just needs reliability-as-code adopts `nthlayer-generate` without needing the rest of the ecosystem.
|
|
355
|
+
|
|
356
|
+
| Repo | Role |
|
|
357
|
+
|---|---|
|
|
358
|
+
| [`opensrm`](https://github.com/rsionnach/opensrm) | The OpenSRM specification β the manifest format and language for declaring reliability |
|
|
359
|
+
| [`nthlayer`](https://github.com/rsionnach/nthlayer) | Project front door β documentation hub, GitHub Action delegating to this repo, docs site |
|
|
360
|
+
| [`nthlayer-common`](https://github.com/rsionnach/nthlayer-common) | Shared library: verdict model, manifest parser, LLM wrapper, error hierarchy, CoreAPIClient |
|
|
361
|
+
| [`nthlayer-generate`](https://github.com/rsionnach/nthlayer-generate) | The deterministic compiler (this repo) β specs to artefacts |
|
|
362
|
+
| [`nthlayer-core`](https://github.com/rsionnach/nthlayer-core) | **Tier 1** β HTTP API server, verdict store, case management, manifest catalogue (`pip install nthlayer`) |
|
|
363
|
+
| [`nthlayer-workers`](https://github.com/rsionnach/nthlayer-workers) | **Tier 2** β five worker modules: observe, measure, correlate, respond, learn |
|
|
364
|
+
| [`nthlayer-bench`](https://github.com/rsionnach/nthlayer-bench) | **Tier 3** β Textual TUI for SREs |
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## π€ Contributing
|
|
369
|
+
|
|
370
|
+
```bash
|
|
371
|
+
# Install uv (https://docs.astral.sh/uv/)
|
|
372
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
373
|
+
|
|
374
|
+
git clone https://github.com/rsionnach/nthlayer-generate.git
|
|
375
|
+
cd nthlayer-generate
|
|
376
|
+
make setup # Install deps, start services
|
|
377
|
+
make test # Run tests
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for details.
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## π License
|
|
385
|
+
|
|
386
|
+
MIT - See [LICENSE.txt](LICENSE.txt)
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
## π Acknowledgments
|
|
391
|
+
|
|
392
|
+
Built on [grafana-foundation-sdk](https://github.com/grafana/grafana-foundation-sdk), [awesome-prometheus-alerts](https://github.com/samber/awesome-prometheus-alerts), [pint](https://github.com/cloudflare/pint), and [OpenSLO](https://github.com/openslo/openslo). Inspired by [Sloth](https://github.com/slok/sloth) and [autograf](https://github.com/FUSAKLA/autograf).
|