detectkit 0.23.0__tar.gz → 0.23.1__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.
- {detectkit-0.23.0/detectkit.egg-info → detectkit-0.23.1}/PKG-INFO +1 -1
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/__init__.py +1 -1
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/html_labeler.py +31 -2
- {detectkit-0.23.0 → detectkit-0.23.1/detectkit.egg-info}/PKG-INFO +1 -1
- {detectkit-0.23.0 → detectkit-0.23.1}/LICENSE +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/MANIFEST.in +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/README.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/channels/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/channels/base.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/channels/branding.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/channels/email.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/channels/factory.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/channels/mattermost.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/channels/slack.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/channels/telegram.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/channels/webhook.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/orchestrator/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/orchestrator/_base.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/orchestrator/_cooldown.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/orchestrator/_decision.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/orchestrator/_dispatch.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/orchestrator/_recovery.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/orchestrator/_types.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/alerting/orchestrator/orchestrator.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/_base.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/_types.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/autotuner.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/config_emitter.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/crossval.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/detector_select.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/distribution.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/grid_search.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/label_server.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/labels.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/result.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/scoring.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/seasonality_search.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/settings.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/autotune/window_select.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/_output.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/CLAUDE.section.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/rules/alerting.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/rules/autotune.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/rules/cli.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/rules/detectors.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/rules/metrics.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/rules/overview.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/rules/project.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/skills/dtk-autotune/SKILL.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/skills/dtk-feedback/SKILL.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/skills/dtk-new-metric/SKILL.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/skills/dtk-setup-project/SKILL.md +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/commands/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/commands/autotune.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/commands/clean.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/commands/init.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/commands/init_claude.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/commands/run.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/commands/test_alert.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/commands/unlock.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/main.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/config/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/config/metric_config.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/config/profile.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/config/project_config.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/config/validator.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/core/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/core/interval.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/core/models.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/_sql_manager.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/clickhouse_manager.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/_alert_states.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/_autotune_runs.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/_base.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/_datapoints.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/_detections.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/_maintenance.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/_metrics.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/_schema.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/_tasks.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/internal_tables/manager.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/manager.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/mysql_manager.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/postgres_manager.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/database/tables.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/detectors/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/detectors/base.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/detectors/factory.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/detectors/seasonality.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/detectors/statistical/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/detectors/statistical/_windowed.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/detectors/statistical/iqr.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/detectors/statistical/mad.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/detectors/statistical/manual_bounds.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/detectors/statistical/zscore.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/loaders/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/loaders/metric_loader.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/loaders/query_template.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/orchestration/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/orchestration/error_dispatch.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/orchestration/task_manager/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/orchestration/task_manager/_alert_step.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/orchestration/task_manager/_base.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/orchestration/task_manager/_detect_step.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/orchestration/task_manager/_load_step.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/orchestration/task_manager/_types.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/orchestration/task_manager/manager.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/utils/__init__.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/utils/datetime_utils.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/utils/env_interpolation.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/utils/json_utils.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit/utils/stats.py +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit.egg-info/SOURCES.txt +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit.egg-info/dependency_links.txt +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit.egg-info/entry_points.txt +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit.egg-info/requires.txt +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/detectkit.egg-info/top_level.txt +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/pyproject.toml +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/requirements.txt +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/setup.cfg +0 -0
- {detectkit-0.23.0 → detectkit-0.23.1}/setup.py +0 -0
|
@@ -4,7 +4,7 @@ detectk - Anomaly Detection for Time-Series Metrics
|
|
|
4
4
|
A Python library for data analysts and engineers to monitor metrics with automatic anomaly detection.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
__version__ = "0.23.
|
|
7
|
+
__version__ = "0.23.1"
|
|
8
8
|
|
|
9
9
|
from detectkit.core.interval import Interval
|
|
10
10
|
from detectkit.core.models import ColumnDefinition, TableModel
|
|
@@ -242,7 +242,35 @@ function draw() {
|
|
|
242
242
|
ctx.fillStyle='rgba(240,173,78,0.28)'; ctx.fillRect(Math.min(x0,x1), M.t*dpr, Math.abs(x1-x0), plotH()); }
|
|
243
243
|
drawSeries(ctx, px, py, viewMin, viewMax, M.l*dpr, plotW(), '#d15b36', 1.5);
|
|
244
244
|
ctx.restore();
|
|
245
|
-
if (
|
|
245
|
+
if (dragging && !ovAct) drawDragLabel();
|
|
246
|
+
else if (hover && !ovAct) drawHover();
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Live time readout while marking/resizing/moving an incident, so you can place
|
|
250
|
+
// an edge precisely (an edge shows old → new; move/new show the resulting span).
|
|
251
|
+
function drawDragLabel() {
|
|
252
|
+
let text, atTs;
|
|
253
|
+
if (dragging.mode==='new') {
|
|
254
|
+
const a=Math.min(dragging.a,dragging.b), b=Math.max(dragging.a,dragging.b);
|
|
255
|
+
text = fmtTs(a)+' → '+fmtTs(b); atTs = dragging.b;
|
|
256
|
+
} else { const iv=incidents[dragging.i]; if (!iv) return;
|
|
257
|
+
if (dragging.mode==='edge') {
|
|
258
|
+
const old = dragging.edge==='a' ? dragging.a0 : dragging.b0;
|
|
259
|
+
const cur = dragging.edge==='a' ? iv.a : iv.b;
|
|
260
|
+
text = (dragging.edge==='a' ? 'start: ' : 'end: ') + fmtTs(old) + ' → ' + fmtTs(cur);
|
|
261
|
+
atTs = cur;
|
|
262
|
+
} else { text = fmtTs(iv.a) + ' → ' + fmtTs(iv.b); atTs = (iv.a+iv.b)/2; }
|
|
263
|
+
}
|
|
264
|
+
const X = clamp(px(atTs), M.l*dpr, c.width-M.r*dpr);
|
|
265
|
+
ctx.font=(11*dpr)+'px ui-monospace, monospace';
|
|
266
|
+
const tw=ctx.measureText(text).width, bw=tw+14*dpr, bh=22*dpr, by=M.t*dpr+2;
|
|
267
|
+
let bx = X - bw/2;
|
|
268
|
+
if (bx < M.l*dpr) bx = M.l*dpr;
|
|
269
|
+
if (bx+bw > c.width-M.r*dpr) bx = c.width-M.r*dpr-bw;
|
|
270
|
+
ctx.fillStyle='rgba(27,25,22,0.96)'; ctx.strokeStyle='#d15b36'; ctx.lineWidth=1*dpr;
|
|
271
|
+
ctx.fillRect(bx, by, bw, bh); ctx.strokeRect(bx, by, bw, bh);
|
|
272
|
+
ctx.fillStyle='#f5f1e8'; ctx.textAlign='left'; ctx.textBaseline='middle';
|
|
273
|
+
ctx.fillText(text, bx+7*dpr, by+bh/2);
|
|
246
274
|
}
|
|
247
275
|
|
|
248
276
|
function drawHover() {
|
|
@@ -309,7 +337,8 @@ c.addEventListener('mousedown', e => {
|
|
|
309
337
|
const hit = hitIncident(e.clientX), t = tsAt(e.clientX);
|
|
310
338
|
if (hit && hit.edge==='move') { const iv=incidents[hit.i];
|
|
311
339
|
dragging={mode:'move', i:hit.i, grab:t, a0:iv.a, b0:iv.b, sx:e.clientX, cx:e.clientX}; }
|
|
312
|
-
else if (hit)
|
|
340
|
+
else if (hit) { const iv=incidents[hit.i];
|
|
341
|
+
dragging={mode:'edge', i:hit.i, edge:hit.edge, a0:iv.a, b0:iv.b, sx:e.clientX, cx:e.clientX}; }
|
|
313
342
|
else dragging={mode:'new', a:t, b:t, sx:e.clientX, cx:e.clientX};
|
|
314
343
|
});
|
|
315
344
|
c.addEventListener('mousemove', e => { if (ovAct) return;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/skills/dtk-autotune/SKILL.md
RENAMED
|
File without changes
|
{detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/skills/dtk-feedback/SKILL.md
RENAMED
|
File without changes
|
{detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/skills/dtk-new-metric/SKILL.md
RENAMED
|
File without changes
|
{detectkit-0.23.0 → detectkit-0.23.1}/detectkit/cli/assets/claude/skills/dtk-setup-project/SKILL.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|