-- ===================================================================== -- Omika Diagnostic Center — SEED PRÉPROD LOCAL (100 % FAKE DATA) -- seed_diagnostics_preprod.sql — T21 -- ===================================================================== -- ⚠️ RÉSERVÉ À LA PRÉPROD LOCALE (base omika_diagnostics_preprod). -- ⚠️ NE JAMAIS EXÉCUTER EN PRODUCTION. -- ⚠️ Données 100 % SYNTHÉTIQUES : source='local-seed', message préfixé -- '[FAKE LOCAL]'. Aucune donnée réelle, aucune donnée personnelle, -- aucun token, aucun mot de passe, aucun CodeClient réel, aucun nom -- de société cliente réelle, aucun nom de machine réel. -- ⚠️ Ré-exécutable : DELETE source='local-seed' puis réinsertion. -- Ne touche JAMAIS aux lignes réelles (source <> 'local-seed'). -- ⚠️ Ne crée AUCUN diagnostics_clients : les clients PREPROD-CLIENT-A/B -- sont créés via l'interface /Clients (clé SHA-256 générée Web). -- ===================================================================== -- Garde-fou : base préprod uniquement. DO $$ BEGIN IF current_database() <> 'omika_diagnostics_preprod' THEN RAISE EXCEPTION 'REFUS : seed préprod uniquement sur omika_diagnostics_preprod (base détectée : %).', current_database(); END IF; END $$; -- Nettoyage idempotent du seed précédent (source = 'local-seed' uniquement). DELETE FROM diagnostic_event WHERE source = 'local-seed'; -- ===================================================================== -- CONVENTIONS CLIENTS (T21 §7) -- FAKE-CLIENT-A (fort volume) : API-A-01, WORKER-A-01 (Production) -- FAKE-CLIENT-B (moyen) : API-B-01, WORKER-B-01 (Production), -- API-B-STG-01 (Staging) -- FAKE-CLIENT-C (faible) : API-C-DEV-01 (Development) -- ===================================================================== -- ===================================================================== -- 1. VOLUME DE FOND MULTI-CLIENTS (HTTP API + Worker) -- ===================================================================== -- 1.1 FAKE-CLIENT-A / API-A-01 / Production — 100 événements HTTP API. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2a000000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - CASE (g % 4) WHEN 0 THEN (random() * interval '6 hours') WHEN 1 THEN interval '6 hours' + (random() * interval '18 hours') WHEN 2 THEN interval '1 day' + (random() * interval '6 days') ELSE interval '7 days' + (random() * interval '23 days') END, (ARRAY['P2','P3','P2','P1','P3'])[1 + (g % 5)], (ARRAY['Info','Info','Debug','Warning','Info'])[1 + (g % 5)], (ARRAY['OMK-API-HTTP-001','OMK-API-HTTP-002'])[1 + (g % 2)], 'Omika.Api', NULL, NULL, NULL, (ARRAY['fake-actor-001','fake-actor-002',NULL])[1 + (g % 3)], 1, (ARRAY['1.0.0','1.1.0'])[1 + (g % 2)], 'api', NULL, '[FAKE LOCAL] api FAKE-CLIENT-A production ' || g, NULL, NULL, (ARRAY[25,150,350,1200,NULL,80])[1 + (g % 6)]::bigint, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"volume"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production' FROM generate_series(1, 100) AS g; -- 1.2 FAKE-CLIENT-A / WORKER-A-01 / Production — 60 traitements Worker réussis. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2b000000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - CASE (g % 4) WHEN 0 THEN (random() * interval '6 hours') WHEN 1 THEN interval '6 hours' + (random() * interval '18 hours') WHEN 2 THEN interval '1 day' + (random() * interval '6 days') ELSE interval '7 days' + (random() * interval '23 days') END, 'P3', (ARRAY['Info','Debug','Info'])[1 + (g % 3)], 'OMK-WKR-SYNC-001', 'Omika.Worker', NULL, NULL, NULL, NULL, NULL, (ARRAY['1.0.0','1.1.0'])[1 + (g % 2)], 'worker', NULL, '[FAKE LOCAL] worker FAKE-CLIENT-A production ' || g, NULL, NULL, (ARRAY[300,450,600,900])[1 + (g % 4)]::bigint, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"volume","retryCount":0}'::jsonb, now(), 'FAKE-CLIENT-A', 'WORKER-A-01', 'Production' FROM generate_series(1, 60) AS g; -- 1.3 FAKE-CLIENT-B / API-B-01 / Production — 50 événements HTTP API. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2c000000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - CASE (g % 4) WHEN 0 THEN (random() * interval '6 hours') WHEN 1 THEN interval '6 hours' + (random() * interval '18 hours') WHEN 2 THEN interval '1 day' + (random() * interval '6 days') ELSE interval '7 days' + (random() * interval '23 days') END, (ARRAY['P2','P3','P2','P1','P3'])[1 + (g % 5)], (ARRAY['Info','Info','Debug','Warning','Info'])[1 + (g % 5)], (ARRAY['OMK-API-HTTP-001','OMK-API-HTTP-002'])[1 + (g % 2)], 'Omika.Api', NULL, NULL, NULL, (ARRAY['fake-actor-002','fake-actor-003',NULL])[1 + (g % 3)], 1, (ARRAY['1.0.0','1.0.1'])[1 + (g % 2)], 'api', NULL, '[FAKE LOCAL] api FAKE-CLIENT-B production ' || g, NULL, NULL, (ARRAY[30,140,360,1100,NULL,90])[1 + (g % 6)]::bigint, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"volume"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production' FROM generate_series(1, 50) AS g; -- 1.4 FAKE-CLIENT-B / WORKER-B-01 / Production — 25 traitements Worker réussis. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2d000000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - CASE (g % 4) WHEN 0 THEN (random() * interval '6 hours') WHEN 1 THEN interval '6 hours' + (random() * interval '18 hours') WHEN 2 THEN interval '1 day' + (random() * interval '6 days') ELSE interval '7 days' + (random() * interval '23 days') END, 'P3', (ARRAY['Info','Debug','Info'])[1 + (g % 3)], 'OMK-WKR-SYNC-001', 'Omika.Worker', NULL, NULL, NULL, NULL, NULL, (ARRAY['1.0.0','1.0.1'])[1 + (g % 2)], 'worker', NULL, '[FAKE LOCAL] worker FAKE-CLIENT-B production ' || g, NULL, NULL, (ARRAY[280,420,580,850])[1 + (g % 4)]::bigint, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"volume","retryCount":0}'::jsonb, now(), 'FAKE-CLIENT-B', 'WORKER-B-01', 'Production' FROM generate_series(1, 25) AS g; -- 1.5 FAKE-CLIENT-B / API-B-STG-01 / Staging — 15 événements HTTP API. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2e000000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - CASE (g % 4) WHEN 0 THEN (random() * interval '6 hours') WHEN 1 THEN interval '6 hours' + (random() * interval '18 hours') WHEN 2 THEN interval '1 day' + (random() * interval '6 days') ELSE interval '7 days' + (random() * interval '23 days') END, (ARRAY['P2','P3','P2'])[1 + (g % 3)], (ARRAY['Info','Debug','Info'])[1 + (g % 3)], (ARRAY['OMK-API-HTTP-001','OMK-API-HTTP-002'])[1 + (g % 2)], 'Omika.Api', NULL, NULL, NULL, 'fake-actor-003', 1, (ARRAY['1.0.1','1.1.0'])[1 + (g % 2)], 'api', NULL, '[FAKE LOCAL] api FAKE-CLIENT-B staging ' || g, NULL, NULL, (ARRAY[40,150,380])[1 + (g % 3)]::bigint, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"volume"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-STG-01', 'Staging' FROM generate_series(1, 15) AS g; -- 1.6 FAKE-CLIENT-C / API-C-DEV-01 / Development — 20 événements HTTP API. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2f000000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - CASE (g % 4) WHEN 0 THEN (random() * interval '6 hours') WHEN 1 THEN interval '6 hours' + (random() * interval '18 hours') WHEN 2 THEN interval '1 day' + (random() * interval '6 days') ELSE interval '7 days' + (random() * interval '23 days') END, 'P3', (ARRAY['Info','Debug','Warning','Info'])[1 + (g % 4)], (ARRAY['OMK-API-HTTP-001','OMK-API-HTTP-002'])[1 + (g % 2)], 'Omika.Api', NULL, NULL, NULL, NULL, NULL, '1.1.0', 'api', NULL, '[FAKE LOCAL] api FAKE-CLIENT-C development ' || g, NULL, NULL, (ARRAY[35,160,400])[1 + (g % 3)]::bigint, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"volume"}'::jsonb, now(), 'FAKE-CLIENT-C', 'API-C-DEV-01', 'Development' FROM generate_series(1, 20) AS g; -- ===================================================================== -- 2. ERREURS FAKE (Info/Warning/Error/Critical + codes répétés, §15) -- Normalisation component/error_code testée par variations casse/espaces. -- ===================================================================== -- 2.1 TIMEOUT — 15 occurrences réparties A/B (variations de casse/espaces). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2e100000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - (random() * interval '7 days'), 'P1', (ARRAY['Error','error'])[1 + (g % 2)], 'OMK-API-HTTP-003', (ARRAY['Omika.Api',' omika.api ','OMIKA.API'])[1 + (g % 3)], NULL, NULL, NULL, 'fake-actor-001', 1, (ARRAY['1.0.0','1.1.0'])[1 + (g % 2)], 'api', (ARRAY['TIMEOUT',' timeout ','timeout'])[1 + (g % 3)], '[FAKE LOCAL] Timeout simulation ' || g, (ARRAY['System.TimeoutException','system.timeoutexception'])[1 + (g % 2)], E'[FAKE LOCAL]\nSystem.TimeoutException: operation timed out\n at Omika.Api.Tests.FakeService.Execute()', (ARRAY[1500,2500,3000,5000])[1 + (g % 4)]::bigint, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"errors","method":"GET","endpoint":"/api/v1/fake","statusCode":504}'::jsonb, now(), (ARRAY['FAKE-CLIENT-A','FAKE-CLIENT-B'])[1 + (g % 2)], (ARRAY['API-A-01','API-B-01'])[1 + (g % 2)], 'Production' FROM generate_series(1, 15) AS g; -- 2.2 NULL_REF — 10 occurrences FAKE-CLIENT-A. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2e200000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - (random() * interval '14 days'), 'P1', 'Error', 'OMK-API-REQ-001', 'Omika.Api', NULL, NULL, NULL, 'fake-actor-001', 1, (ARRAY['1.0.0','1.1.0'])[1 + (g % 2)], 'api', 'NULL_REF', '[FAKE LOCAL] NullReferenceException simulation ' || g, 'System.NullReferenceException', E'[FAKE LOCAL]\nSystem.NullReferenceException: Object reference not set\n at Omika.Api.Tests.FakeService.Execute()', NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"errors","endpoint":"/api/v1/fake"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production' FROM generate_series(1, 10) AS g; -- 2.3 HTTP_500 — 12 occurrences FAKE-CLIENT-B (Production + Staging). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2e300000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - (random() * interval '30 days'), 'P1', 'Error', 'OMK-API-HTTP-003', 'Omika.Api', NULL, NULL, NULL, 'fake-actor-002', 1, (ARRAY['1.0.0','1.0.1'])[1 + (g % 2)], 'api', 'HTTP_500', '[FAKE LOCAL] HttpRequestException simulation ' || g, 'System.Net.Http.HttpRequestException', E'[FAKE LOCAL]\nSystem.Net.Http.HttpRequestException: 500 Internal Server Error\n at Omika.Api.Tests.FakeService.Send()', (ARRAY[800,1200,2000])[1 + (g % 3)]::bigint, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"errors","statusCode":500}'::jsonb, now(), 'FAKE-CLIENT-B', (ARRAY['API-B-01','API-B-STG-01'])[1 + (g % 2)], (ARRAY['Production','Staging'])[1 + (g % 2)] FROM generate_series(1, 12) AS g; -- 2.4 SYNC_FAILED — 8 occurrences (échec de synchronisation). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2e400000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - (random() * interval '10 days'), 'P1', 'Error', 'OMK-WKR-SYNC-002', 'Omika.Worker', NULL, NULL, NULL, NULL, NULL, (ARRAY['1.0.0','1.0.1'])[1 + (g % 2)], 'worker', 'SYNC_FAILED', '[FAKE LOCAL] sync failure simulation ' || g, 'System.InvalidOperationException', E'[FAKE LOCAL]\nSystem.InvalidOperationException: sync rejected\n at Omika.Worker.Tests.FakeHandler.Apply()', (ARRAY[500,600,900])[1 + (g % 3)]::bigint, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"errors","retryCount":2}'::jsonb, now(), 'FAKE-CLIENT-B', 'WORKER-B-01', 'Production' FROM generate_series(1, 8) AS g; -- 2.5 SYNC_RETRY — 8 occurrences (retry transitoire). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2e500000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - (random() * interval '8 days'), 'P2', 'Warning', 'OMK-WKR-SYNC-002', 'Omika.Worker', NULL, NULL, NULL, NULL, NULL, (ARRAY['1.0.0','1.1.0'])[1 + (g % 2)], 'worker', 'SYNC_RETRY', '[FAKE LOCAL] sync retry simulation ' || g, NULL, NULL, (ARRAY[200,300,400])[1 + (g % 3)]::bigint, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"errors","retryCount":1}'::jsonb, now(), 'FAKE-CLIENT-A', 'WORKER-A-01', 'Production' FROM generate_series(1, 8) AS g; -- 2.6 CRASH critique — 4 occurrences FAKE-CLIENT-C (Critical). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) SELECT ('2e600000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - (random() * interval '2 days'), 'P0', 'Critical', 'OMK-API-HTTP-003', 'Omika.Api', NULL, NULL, NULL, NULL, NULL, '1.1.0', 'api', 'CRASH', '[FAKE LOCAL] Critical crash simulation ' || g, 'System.OutOfMemoryException', E'[FAKE LOCAL]\nSystem.OutOfMemoryException: insufficient memory\n at Omika.Api.Tests.FakeService.Allocate()', NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"errors"}'::jsonb, now(), 'FAKE-CLIENT-C', 'API-C-DEV-01', 'Development' FROM generate_series(1, 4) AS g; -- ===================================================================== -- 3. TRACES SYNTHÉTIQUES (TraceId partagé) — pour /Traces (§12) -- ===================================================================== -- Trace T1 : FAKE-CLIENT-A / API-A-01 — mobile → API → réponse (4 événements). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) VALUES ('3a000000-0000-0000-0000-000000000001', now() - interval '35 minutes', 'P2', 'Info', 'OMK-MOB-APP-001', 'Omika.App', 'aaaaaaaa-1111-4111-8111-111111111111', NULL, NULL, 'fake-actor-001', 1, '1.1.0', 'Android', NULL, '[FAKE LOCAL] trace T1 - mobile started', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"trace"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production'), ('3a000000-0000-0000-0000-000000000002', now() - interval '34 minutes', 'P2', 'Info', 'OMK-API-HTTP-001', 'Omika.Api', 'aaaaaaaa-1111-4111-8111-111111111111', NULL, NULL, NULL, NULL, '1.1.0', 'api', NULL, '[FAKE LOCAL] trace T1 - api request', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"trace","method":"POST","endpoint":"/api/v1/sync"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production'), ('3a000000-0000-0000-0000-000000000003', now() - interval '33 minutes', 'P2', 'Info', 'OMK-API-HTTP-002', 'Omika.Api', 'aaaaaaaa-1111-4111-8111-111111111111', NULL, NULL, NULL, NULL, '1.1.0', 'api', NULL, '[FAKE LOCAL] trace T1 - api processing', NULL, NULL, 350, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"trace","statusCode":200}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production'), ('3a000000-0000-0000-0000-000000000004', now() - interval '32 minutes', 'P2', 'Info', 'OMK-API-HTTP-002', 'Omika.Api', 'aaaaaaaa-1111-4111-8111-111111111111', NULL, NULL, NULL, NULL, '1.1.0', 'api', NULL, '[FAKE LOCAL] trace T1 - api response', NULL, NULL, 420, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"trace","statusCode":200}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production'); -- Trace T2 : FAKE-CLIENT-B / API-B-01 — API → traitement → erreur (3 événements). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) VALUES ('3b000000-0000-0000-0000-000000000001', now() - interval '6 hours', 'P2', 'Info', 'OMK-API-HTTP-001', 'Omika.Api', 'bbbbbbbb-2222-4222-8222-222222222222', NULL, NULL, NULL, NULL, '1.0.1', 'api', NULL, '[FAKE LOCAL] trace T2 - api request', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"trace","method":"GET","endpoint":"/api/v1/fake"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production'), ('3b000000-0000-0000-0000-000000000003', now() - interval '6 hours' + interval '25 ms', 'P2', 'Info', 'OMK-API-HTTP-002', 'Omika.Api', 'bbbbbbbb-2222-4222-8222-222222222222', NULL, NULL, NULL, NULL, '1.0.1', 'api', NULL, '[FAKE LOCAL] trace T2 - api processing', NULL, NULL, 300, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"trace","statusCode":200}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production'), ('3b000000-0000-0000-0000-000000000002', now() - interval '6 hours' + interval '50 ms', 'P1', 'Error', 'OMK-API-HTTP-003', 'Omika.Api', 'bbbbbbbb-2222-4222-8222-222222222222', NULL, NULL, NULL, NULL, '1.0.1', 'api', 'HTTP_500', '[FAKE LOCAL] trace T2 - traitement en erreur', 'System.Net.Http.HttpRequestException', E'[FAKE LOCAL]\nSystem.Net.Http.HttpRequestException: 500\n at Omika.Api.Tests.FakeService.Send()', 1200, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"trace","statusCode":500}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production'); -- Trace T3 : FAKE-CLIENT-C / API-C-DEV-01 / Development — succès rapide (3 événements). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) VALUES ('3c000000-0000-0000-0000-000000000001', now() - interval '12 hours', 'P3', 'Info', 'OMK-API-HTTP-001', 'Omika.Api', 'cccccccc-3333-4333-8333-333333333333', NULL, NULL, NULL, NULL, '1.1.0', 'api', NULL, '[FAKE LOCAL] trace T3 - api request', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"trace"}'::jsonb, now(), 'FAKE-CLIENT-C', 'API-C-DEV-01', 'Development'), ('3c000000-0000-0000-0000-000000000002', now() - interval '12 hours' + interval '30 ms', 'P3', 'Info', 'OMK-API-HTTP-002', 'Omika.Api', 'cccccccc-3333-4333-8333-333333333333', NULL, NULL, NULL, NULL, '1.1.0', 'api', NULL, '[FAKE LOCAL] trace T3 - api processing', NULL, NULL, 80, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"trace","statusCode":200}'::jsonb, now(), 'FAKE-CLIENT-C', 'API-C-DEV-01', 'Development'), ('3c000000-0000-0000-0000-000000000003', now() - interval '12 hours' + interval '45 ms', 'P3', 'Info', 'OMK-API-HTTP-002', 'Omika.Api', 'cccccccc-3333-4333-8333-333333333333', NULL, NULL, NULL, NULL, '1.1.0', 'api', NULL, '[FAKE LOCAL] trace T3 - api response', NULL, NULL, 90, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"trace","statusCode":200}'::jsonb, now(), 'FAKE-CLIENT-C', 'API-C-DEV-01', 'Development'); -- ===================================================================== -- 4. SYNCHRONISATION SYNTHÉTIQUE (OperationId partagé) — succès/retry/échec (§25) -- EventCodes exacts : OMK-MOB-SYNC-001 / OMK-WKR-SYNC-001 / OMK-WKR-SYNC-002 -- ===================================================================== -- Opération OP-SUCCESS (FAKE-CLIENT-A / Production) : succès mobile → worker. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) VALUES ('45000000-0000-0000-0000-000000000001', now() - interval '1 hour', 'P2', 'Info', 'OMK-MOB-SYNC-001', 'Omika.App', NULL, '5e5e5e5e-5000-4000-8000-0000000000a1', '0a0a0a0a-1000-4000-8000-000000000001', 'fake-actor-001', 1, '1.1.0', 'Android', NULL, '[FAKE LOCAL] sync OP-SUCCESS - operation reçue', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"sync"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production'), ('45000000-0000-0000-0000-000000000002', now() - interval '59 minutes', 'P3', 'Info', 'OMK-WKR-SYNC-001', 'Omika.Worker', NULL, NULL, '0a0a0a0a-1000-4000-8000-000000000001', NULL, NULL, '1.1.0', 'worker', NULL, '[FAKE LOCAL] sync OP-SUCCESS - worker processing', NULL, NULL, 450, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"sync","retryCount":0}'::jsonb, now(), 'FAKE-CLIENT-A', 'WORKER-A-01', 'Production'), ('45000000-0000-0000-0000-000000000003', now() - interval '58 minutes', 'P3', 'Info', 'OMK-WKR-SYNC-001', 'Omika.Worker', NULL, NULL, '0a0a0a0a-1000-4000-8000-000000000001', NULL, NULL, '1.1.0', 'worker', NULL, '[FAKE LOCAL] sync OP-SUCCESS - worker success', NULL, NULL, 480, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"sync","retryCount":0}'::jsonb, now(), 'FAKE-CLIENT-A', 'WORKER-A-01', 'Production'); -- Opération OP-FAIL (FAKE-CLIENT-B / Production) : échec définitif worker. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) VALUES ('45000000-0000-0000-0000-000000000004', now() - interval '3 hours', 'P1', 'Info', 'OMK-MOB-SYNC-001', 'Omika.App', NULL, '5e5e5e5e-5000-4000-8000-0000000000a2', '0b0b0b0b-1000-4000-8000-000000000002', 'fake-actor-002', 1, '1.0.0', 'iOS', NULL, '[FAKE LOCAL] sync OP-FAIL - operation reçue', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"sync"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production'), ('45000000-0000-0000-0000-000000000005', now() - interval '3 hours' + interval '10 seconds', 'P1', 'Error', 'OMK-WKR-SYNC-002', 'Omika.Worker', NULL, NULL, '0b0b0b0b-1000-4000-8000-000000000002', NULL, NULL, '1.0.0', 'worker', 'SYNC_FAILED', '[FAKE LOCAL] sync OP-FAIL - worker failure', 'System.InvalidOperationException', E'[FAKE LOCAL]\nSystem.InvalidOperationException: sync rejected\n at Omika.Worker.Tests.FakeHandler.Apply()', 600, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"sync","retryCount":2}'::jsonb, now(), 'FAKE-CLIENT-B', 'WORKER-B-01', 'Production'); -- Opération OP-RETRY (FAKE-CLIENT-B / Production) : retry transitoire worker. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) VALUES ('45000000-0000-0000-0000-000000000006', now() - interval '9 hours', 'P2', 'Warning', 'OMK-MOB-SYNC-001', 'Omika.App', NULL, '5e5e5e5e-5000-4000-8000-0000000000a3', '0c0c0c0c-1000-4000-8000-000000000003', 'fake-actor-003', 1, '1.1.0', 'Desktop', NULL, '[FAKE LOCAL] sync OP-RETRY - operation reçue', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"sync"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production'), ('45000000-0000-0000-0000-000000000007', now() - interval '9 hours' + interval '5 seconds', 'P2', 'Warning', 'OMK-WKR-SYNC-002', 'Omika.Worker', NULL, NULL, '0c0c0c0c-1000-4000-8000-000000000003', NULL, NULL, '1.1.0', 'worker', 'SYNC_RETRY', '[FAKE LOCAL] sync OP-RETRY - transient retry', NULL, NULL, 300, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"sync","retryCount":1}'::jsonb, now(), 'FAKE-CLIENT-B', 'WORKER-B-01', 'Production'); -- ===================================================================== -- 5. SESSIONS PARTAGÉES (SessionId) — corrélation du détail. -- ===================================================================== -- Session S1 (FAKE-CLIENT-A / Production). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) VALUES ('5a000000-0000-0000-0000-000000000001', now() - interval '2 hours', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, '5e5e5e5e-5000-4000-8000-0000000000b1', NULL, 'fake-actor-001', 1, '1.1.0', 'Android', NULL, '[FAKE LOCAL] session S1 - app started', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"session"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production'), ('5a000000-0000-0000-0000-000000000002', now() - interval '1 hour 50 minutes', 'P3', 'Info', 'OMK-MOB-DIAG-001', 'Omika.App', NULL, '5e5e5e5e-5000-4000-8000-0000000000b1', NULL, 'fake-actor-001', 1, '1.1.0', 'Android', NULL, '[FAKE LOCAL] session S1 - diagnostic init', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"session"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production'), ('5a000000-0000-0000-0000-000000000003', now() - interval '1 hour 40 minutes', 'P2', 'Warning', 'OMK-MOB-APP-002', 'Omika.App', NULL, '5e5e5e5e-5000-4000-8000-0000000000b1', NULL, 'fake-actor-001', 1, '1.1.0', 'Android', NULL, '[FAKE LOCAL] session S1 - app session stopped', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"session"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production'); -- Session S2 (FAKE-CLIENT-B / Production). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) VALUES ('5b000000-0000-0000-0000-000000000001', now() - interval '30 minutes', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, '5f5f5f5f-5000-4000-8000-0000000000b2', NULL, 'fake-actor-002', 1, '1.0.0', 'iOS', NULL, '[FAKE LOCAL] session S2 - app started', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"session"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production'), ('5b000000-0000-0000-0000-000000000002', now() - interval '29 minutes', 'P3', 'Info', 'OMK-MOB-DIAG-001', 'Omika.App', NULL, '5f5f5f5f-5000-4000-8000-0000000000b2', NULL, 'fake-actor-002', 1, '1.0.0', 'iOS', NULL, '[FAKE LOCAL] session S2 - diagnostic init', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"session"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production'); -- ===================================================================== -- 6. SCREENVIEW (usage, §13) — 250 vues pondérées sur 12 écrans du catalogue. -- EventCode OMK-MOB-UI-001. AGENDA dominant, SETTINGS rare. -- ===================================================================== INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment, license_number, device_key, device_key_version, device_manufacturer, device_model, operating_system, operating_system_version, app_build, screen_width, screen_height, logical_width, logical_height, display_scale, screen_code, feature_code) SELECT ('61000000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - (g % 60) * interval '5 hours', 'P4', 'Info', 'OMK-MOB-UI-001', 'Navigation', NULL, ('6a000000-0000-0000-0000-' || lpad((g % 30)::text, 12, '0'))::uuid, NULL, (ARRAY['fake-actor-001','fake-actor-002','fake-actor-003'])[1 + (g % 3)], 1, (ARRAY['1.0.0','1.0.1','1.1.0'])[1 + (g % 3)], (ARRAY['Android','Android','iOS','Desktop'])[1 + (g % 4)], NULL, '[FAKE LOCAL] ScreenView', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"screen-view"}'::jsonb, now(), (ARRAY['FAKE-CLIENT-A','FAKE-CLIENT-B','FAKE-CLIENT-C'])[1 + (g % 3)], (ARRAY['API-A-01','API-B-01','API-C-DEV-01'])[1 + (g % 3)], (ARRAY['Production','Production','Development'])[1 + (g % 3)], (ARRAY['FAKE-LIC-C','FAKE-LIC-D','FAKE-LIC-E','FAKE-LIC-DESKTOP-A','FAKE-LIC-DESKTOP-B','FAKE-LIC-F'])[1 + (g % 6)], (ARRAY['devk-android-google-c','devk-ios-apple-d','devk-ios-apple-e','devk-desktop-windows-f','devk-desktop-windows-g','devk-android-extra-h'])[1 + (g % 6)], 1, (ARRAY['Google','Apple','Apple','Microsoft','Dell','OnePlus'])[1 + (g % 6)], (ARRAY['Pixel 8','iPhone 15 Pro','iPhone 16 Pro Max','Surface Pro 9','XPS 15','OnePlus 12'])[1 + (g % 6)], (ARRAY['Android','iOS','iOS','Windows','Windows','Android'])[1 + (g % 6)], (ARRAY['14','17.6','18.7','11','10','14'])[1 + (g % 6)], (ARRAY['1','2','3','4','5','6'])[1 + (g % 6)], 1080, 2400, 393, 873, 2.75, (CASE WHEN g <= 40 THEN 'AGENDA' WHEN g <= 70 THEN 'SITE_DETAIL' WHEN g <= 100 THEN 'RENDEZVOUS_DETAIL' WHEN g <= 130 THEN 'INTERVENTION_SEARCH' WHEN g <= 160 THEN 'INTERVENTION_DETAIL' WHEN g <= 180 THEN 'RAPPORT' WHEN g <= 195 THEN 'EMAIL' WHEN g <= 210 THEN 'TEAM' WHEN g <= 220 THEN 'SETTINGS' WHEN g <= 230 THEN 'DOSSIER_LIST' WHEN g <= 240 THEN 'CLIENT_LIST' ELSE 'SITE_LIST' END), NULL FROM generate_series(1, 250) AS g; -- ===================================================================== -- 7. FEATUREUSE (usage, §14) — 120 utilisations, fréquences DIFFÉRENTES. -- INTERVENTION_SEARCH_RUN (60) > REPORT_GENERATE (36) > EMAIL_SEND (24). -- EventCode OMK-MOB-UI-002. -- ===================================================================== INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment, license_number, device_key, device_key_version, device_manufacturer, device_model, operating_system, operating_system_version, app_build, screen_width, screen_height, logical_width, logical_height, display_scale, screen_code, feature_code) SELECT ('62000000-0000-0000-0000-' || lpad(g::text, 12, '0'))::uuid, now() - (g % 50) * interval '4 hours', 'P4', 'Info', 'OMK-MOB-UI-002', (CASE WHEN g <= 60 THEN 'InterventionsViewModel' WHEN g <= 96 THEN 'RapportChampsViewModel' ELSE 'NouveauEmailViewModel' END), NULL, ('6a000000-0000-0000-0000-' || lpad((g % 30)::text, 12, '0'))::uuid, NULL, (ARRAY['fake-actor-001','fake-actor-002','fake-actor-003'])[1 + (g % 3)], 1, (ARRAY['1.0.0','1.0.1','1.1.0'])[1 + (g % 3)], (ARRAY['Android','Android','iOS','Desktop'])[1 + (g % 4)], NULL, '[FAKE LOCAL] FeatureUse', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"feature-use"}'::jsonb, now(), (ARRAY['FAKE-CLIENT-A','FAKE-CLIENT-B','FAKE-CLIENT-C'])[1 + (g % 3)], (ARRAY['API-A-01','API-B-01','API-C-DEV-01'])[1 + (g % 3)], (ARRAY['Production','Production','Development'])[1 + (g % 3)], (ARRAY['FAKE-LIC-C','FAKE-LIC-D','FAKE-LIC-E','FAKE-LIC-DESKTOP-A','FAKE-LIC-DESKTOP-B','FAKE-LIC-F'])[1 + (g % 6)], (ARRAY['devk-android-google-c','devk-ios-apple-d','devk-ios-apple-e','devk-desktop-windows-f','devk-desktop-windows-g','devk-android-extra-h'])[1 + (g % 6)], 1, (ARRAY['Google','Apple','Apple','Microsoft','Dell','OnePlus'])[1 + (g % 6)], (ARRAY['Pixel 8','iPhone 15 Pro','iPhone 16 Pro Max','Surface Pro 9','XPS 15','OnePlus 12'])[1 + (g % 6)], (ARRAY['Android','iOS','iOS','Windows','Windows','Android'])[1 + (g % 6)], (ARRAY['14','17.6','18.7','11','10','14'])[1 + (g % 6)], (ARRAY['1','2','3','4','5','6'])[1 + (g % 6)], 1080, 2400, 393, 873, 2.75, (CASE WHEN g <= 60 THEN 'INTERVENTION_SEARCH' WHEN g <= 96 THEN 'RAPPORT' ELSE 'EMAIL' END), (CASE WHEN g <= 60 THEN 'INTERVENTION_SEARCH_RUN' WHEN g <= 96 THEN 'REPORT_GENERATE' ELSE 'EMAIL_SEND' END) FROM generate_series(1, 120) AS g; -- ===================================================================== -- 8. CAS PARC (§9-§11) : licence réattribuée, changement OS, changement version, -- appareils Desktop/Windows, variété de flotte. -- ===================================================================== -- 8.1 Réattribution de licence FAKE-LIC-REASSIGNED : -- Device A (Android 15, ancien) → Device B (iOS 18, récent). -- MÊME LicenseNumber sur deux DeviceKey = 2 appareils DISTINCTS, jamais fusionnés. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment, license_number, device_key, device_key_version, device_manufacturer, device_model, operating_system, operating_system_version, app_build, screen_width, screen_height, logical_width, logical_height, display_scale, screen_code, feature_code) VALUES ('71000000-0000-0000-0000-000000000001', now() - interval '20 days', 'P2', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-001', 1, '1.0.0', 'Android', NULL, '[FAKE LOCAL] reassigned device A (old)', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"license-reassigned"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production', 'FAKE-LIC-REASSIGNED', 'devk-reassigned-android-a', 1, 'Samsung', 'SM-S921B', 'Android', '15', '1', 1080, 2400, 360, 800, 3.0, 'AGENDA', NULL), ('71000000-0000-0000-0000-000000000002', now() - interval '18 days', 'P2', 'Info', 'OMK-MOB-DIAG-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-001', 1, '1.0.0', 'Android', NULL, '[FAKE LOCAL] reassigned device A (old)', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"license-reassigned"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production', 'FAKE-LIC-REASSIGNED', 'devk-reassigned-android-a', 1, 'Samsung', 'SM-S921B', 'Android', '15', '1', 1080, 2400, 360, 800, 3.0, 'SITE_DETAIL', NULL), ('71000000-0000-0000-0000-000000000003', now() - interval '2 days', 'P2', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-002', 1, '1.1.0', 'iOS', NULL, '[FAKE LOCAL] reassigned device B (recent)', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"license-reassigned"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production', 'FAKE-LIC-REASSIGNED', 'devk-reassigned-ios-b', 1, 'Apple', 'iPhone 15 Pro', 'iOS', '18', '3', 1179, 2556, 393, 852, 3.0, 'RENDEZVOUS_DETAIL', NULL), ('71000000-0000-0000-0000-000000000004', now() - interval '1 day', 'P2', 'Info', 'OMK-MOB-DIAG-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-002', 1, '1.1.0', 'iOS', NULL, '[FAKE LOCAL] reassigned device B (recent)', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"license-reassigned"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production', 'FAKE-LIC-REASSIGNED', 'devk-reassigned-ios-b', 1, 'Apple', 'iPhone 15 Pro', 'iOS', '18', '3', 1179, 2556, 393, 852, 3.0, 'INTERVENTION_DETAIL', NULL); -- 8.2 Changement d'OS d'un même DeviceKey (§10) : devk-android-samsung-a -- Android 15 → Android 16. Vue parc actuelle = Android 16 (dernière observation). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment, license_number, device_key, device_key_version, device_manufacturer, device_model, operating_system, operating_system_version, app_build, screen_width, screen_height, logical_width, logical_height, display_scale, screen_code, feature_code) VALUES ('72000000-0000-0000-0000-000000000001', now() - interval '12 days', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-001', 1, '1.1.0', 'Android', NULL, '[FAKE LOCAL] os change samsung-a (old Android 15)', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"os-change"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production', 'FAKE-LIC-A', 'devk-android-samsung-a', 1, 'Samsung', 'SM-S928B', 'Android', '15', '1', 1080, 2400, 360, 800, 3.0, 'AGENDA', NULL), ('72000000-0000-0000-0000-000000000002', now() - interval '3 days', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-001', 1, '1.1.0', 'Android', NULL, '[FAKE LOCAL] os change samsung-a (recent Android 16)', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"os-change"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production', 'FAKE-LIC-A', 'devk-android-samsung-a', 1, 'Samsung', 'SM-S928B', 'Android', '16', '2', 1080, 2400, 360, 800, 3.0, 'SITE_DETAIL', NULL); -- 8.3 Changement de version Omika d'un même DeviceKey (§11) : devk-android-xiaomi-b -- 1.0.0 → 1.1.0. Vue parc actuelle = 1.1.0 (dernière observation). INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment, license_number, device_key, device_key_version, device_manufacturer, device_model, operating_system, operating_system_version, app_build, screen_width, screen_height, logical_width, logical_height, display_scale, screen_code, feature_code) VALUES ('73000000-0000-0000-0000-000000000001', now() - interval '15 days', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-002', 1, '1.0.0', 'Android', NULL, '[FAKE LOCAL] version change xiaomi-b (old 1.0.0)', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"version-change"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production', 'FAKE-LIC-B', 'devk-android-xiaomi-b', 1, 'Xiaomi', '23113RKC6G', 'Android', '16', '1', 1080, 2400, 393, 873, 2.75, 'AGENDA', NULL), ('73000000-0000-0000-0000-000000000002', now() - interval '4 days', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-002', 1, '1.1.0', 'Android', NULL, '[FAKE LOCAL] version change xiaomi-b (recent 1.1.0)', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"version-change"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production', 'FAKE-LIC-B', 'devk-android-xiaomi-b', 1, 'Xiaomi', '23113RKC6G', 'Android', '16', '3', 1080, 2400, 393, 873, 2.75, 'SITE_DETAIL', NULL); -- 8.4 Appareils Desktop/Windows + variété de flotte (§8) — 8 observations. INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment, license_number, device_key, device_key_version, device_manufacturer, device_model, operating_system, operating_system_version, app_build, screen_width, screen_height, logical_width, logical_height, display_scale, screen_code, feature_code) VALUES ('74000000-0000-0000-0000-000000000001', now() - interval '6 days', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-001', 1, '1.0.0', 'Desktop', NULL, '[FAKE LOCAL] fleet desktop surface', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"fleet-desktop"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production', 'FAKE-LIC-DESKTOP-A', 'devk-desktop-windows-f', 1, 'Microsoft', 'Surface Pro 9', 'Windows', '11', '1', 2880, 1920, 1440, 960, 1.5, 'AGENDA', NULL), ('74000000-0000-0000-0000-000000000002', now() - interval '6 days', 'P3', 'Info', 'OMK-MOB-DIAG-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-001', 1, '1.0.0', 'Desktop', NULL, '[FAKE LOCAL] fleet desktop surface diag', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"fleet-desktop"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production', 'FAKE-LIC-DESKTOP-A', 'devk-desktop-windows-f', 1, 'Microsoft', 'Surface Pro 9', 'Windows', '11', '1', 2880, 1920, 1440, 960, 1.5, 'SETTINGS', NULL), ('74000000-0000-0000-0000-000000000003', now() - interval '8 days', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-002', 1, '1.1.0', 'Desktop', NULL, '[FAKE LOCAL] fleet desktop dell xps', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"fleet-desktop"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production', 'FAKE-LIC-DESKTOP-B', 'devk-desktop-windows-g', 1, 'Dell', 'XPS 15', 'Windows', '10', '3', 3840, 2400, 1920, 1200, 2.0, 'TEAM', NULL), ('74000000-0000-0000-0000-000000000004', now() - interval '9 days', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-003', 1, '1.0.0', 'Android', NULL, '[FAKE LOCAL] fleet device google pixel', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"fleet-variety"}'::jsonb, now(), 'FAKE-CLIENT-C', 'API-C-DEV-01', 'Development', 'FAKE-LIC-C', 'devk-android-google-c', 1, 'Google', 'Pixel 8', 'Android', '14', '2', 1080, 2400, 360, 800, 3.0, 'SETTINGS', NULL), ('74000000-0000-0000-0000-000000000005', now() - interval '7 days', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-002', 1, '1.0.0', 'iOS', NULL, '[FAKE LOCAL] fleet device iphone 15 pro', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"fleet-variety"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production', 'FAKE-LIC-D', 'devk-ios-apple-d', 1, 'Apple', 'iPhone 15 Pro', 'iOS', '17.6', '1', 1179, 2556, 393, 852, 3.0, 'RENDEZVOUS_DETAIL', NULL), ('74000000-0000-0000-0000-000000000006', now() - interval '7 days', 'P3', 'Info', 'OMK-MOB-DIAG-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-003', 1, '1.0.0', 'iOS', NULL, '[FAKE LOCAL] fleet device iphone 16 pro max', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"fleet-variety"}'::jsonb, now(), 'FAKE-CLIENT-C', 'API-C-DEV-01', 'Development', 'FAKE-LIC-E', 'devk-ios-apple-e', 1, 'Apple', 'iPhone 16 Pro Max', 'iOS', '18.7', '2', 1206, 2622, 402, 874, 3.0, 'EMAIL', NULL), ('74000000-0000-0000-0000-000000000007', now() - interval '10 days', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-001', 1, '1.1.0', 'Android', NULL, '[FAKE LOCAL] fleet device samsung again', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"fleet-variety"}'::jsonb, now(), 'FAKE-CLIENT-A', 'API-A-01', 'Production', 'FAKE-LIC-A', 'devk-android-samsung-a', 1, 'Samsung', 'SM-S928B', 'Android', '16', '2', 1080, 2400, 360, 800, 3.0, 'RAPPORT', NULL), ('74000000-0000-0000-0000-000000000008', now() - interval '10 days', 'P3', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-002', 1, '1.1.0', 'Android', NULL, '[FAKE LOCAL] fleet device xiaomi again', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"fleet-variety"}'::jsonb, now(), 'FAKE-CLIENT-B', 'API-B-01', 'Production', 'FAKE-LIC-B', 'devk-android-xiaomi-b', 1, 'Xiaomi', '23113RKC6G', 'Android', '16', '3', 1080, 2400, 393, 873, 2.75, 'INTERVENTION_SEARCH', NULL); -- ===================================================================== -- 9. DONNÉES HISTORIQUES SANS CONTEXTE (§16) : -- device_key / license_number / screen_code / feature_code = NULL. -- Elles restent affichables sans filtre, et exclues par les filtres appareil/ -- licence/écran/fonctionnalité. Toujours source='local-seed' + [FAKE LOCAL]. -- ===================================================================== INSERT INTO diagnostic_event (event_id, timestamp_utc, priority, level, event_code, component, trace_id, session_id, operation_id, actor_key, actor_key_version, app_version, platform, error_code, message, exception_type, stack_trace, duration_ms, source, metadata_json, ingested_at_utc, client_code, server_instance, environment) VALUES ('7a000000-0000-0000-0000-000000000001', now() - interval '18 days', 'P2', 'Info', 'OMK-MOB-APP-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-001', 1, '1.0.0', 'Android', NULL, '[FAKE LOCAL] historique sans contexte 1', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"historical-null"}'::jsonb, now(), NULL, NULL, NULL), ('7a000000-0000-0000-0000-000000000002', now() - interval '22 days', 'P3', 'Info', 'OMK-API-HTTP-001', 'Omika.Api', NULL, NULL, NULL, NULL, NULL, '1.0.0', 'api', NULL, '[FAKE LOCAL] historique sans contexte 2', NULL, NULL, 120, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"historical-null"}'::jsonb, now(), NULL, NULL, NULL), ('7a000000-0000-0000-0000-000000000003', now() - interval '26 days', 'P1', 'Error', 'OMK-API-HTTP-003', 'Omika.Api', NULL, NULL, NULL, NULL, NULL, '1.0.0', 'api', 'TIMEOUT', '[FAKE LOCAL] historique sans contexte 3', 'System.TimeoutException', E'[FAKE LOCAL]\nSystem.TimeoutException: legacy\n at Omika.Api.Tests.FakeService.Execute()', 2000, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"historical-null"}'::jsonb, now(), NULL, NULL, NULL), ('7a000000-0000-0000-0000-000000000004', now() - interval '30 days', 'P2', 'Warning', 'OMK-MOB-APP-002', 'Omika.App', NULL, NULL, NULL, 'fake-actor-002', 1, '1.0.0', 'iOS', NULL, '[FAKE LOCAL] historique sans contexte 4', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"historical-null"}'::jsonb, now(), NULL, NULL, NULL), ('7a000000-0000-0000-0000-000000000005', now() - interval '35 days', 'P3', 'Debug', 'OMK-MOB-DIAG-001', 'Omika.App', NULL, NULL, NULL, 'fake-actor-003', 1, '1.0.0', 'Desktop', NULL, '[FAKE LOCAL] historique sans contexte 5', NULL, NULL, NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"historical-null"}'::jsonb, now(), NULL, NULL, NULL), ('7a000000-0000-0000-0000-000000000006', now() - interval '40 days', 'P1', 'Error', 'OMK-API-REQ-001', 'Omika.Api', NULL, NULL, NULL, NULL, NULL, '1.0.0', 'api', 'NULL_REF', '[FAKE LOCAL] historique sans contexte 6', 'System.NullReferenceException', E'[FAKE LOCAL]\nSystem.NullReferenceException: legacy\n at Omika.Api.Tests.FakeService.Execute()', NULL, 'local-seed', '{"synthetic":true,"seed":"omika-local-diagnostics-preprod","t21":"historical-null"}'::jsonb, now(), NULL, NULL, NULL); -- ===================================================================== -- FIN DU SEED T21. Volume attendu (~730 événements local-seed) : -- 270 volume de fond + 57 erreurs + 10 traces + 7 synchronisation + -- 5 sessions + 250 ScreenView + 120 FeatureUse + 16 parc + 6 historiques NULL. -- Requêtes de contrôle : -- SELECT count(*) FROM diagnostic_event WHERE source = 'local-seed'; -- SELECT client_code, count(*) FROM diagnostic_event WHERE source='local-seed' GROUP BY 1 ORDER BY 1 NULLS LAST; -- SELECT count(DISTINCT device_key) FROM diagnostic_event WHERE source='local-seed' AND device_key IS NOT NULL; -- SELECT count(DISTINCT license_number) FROM diagnostic_event WHERE source='local-seed' AND license_number IS NOT NULL; -- SELECT screen_code, count(*) FROM diagnostic_event WHERE source='local-seed' AND screen_code IS NOT NULL GROUP BY 1 ORDER BY 2 DESC; -- SELECT feature_code, count(*) FROM diagnostic_event WHERE source='local-seed' AND feature_code IS NOT NULL GROUP BY 1 ORDER BY 2 DESC; -- =====================================================================