Vertrauen Sie Ihren Augen und dem, was Sie im Dashboard sehen
Bei Wheely verlassen wir uns stark auf Daten, um operative und strategische Entscheidungen zu treffen. Von der Zahlung wöchentlicher Boni an Partner bis zur Expansion in andere Städte und Länder.
Jeder Manager oder Product Owner kennt sein Gebiet genau und Abweichungen können Fragen aufwerfen. Daher werden erhöhte Anforderungen an die Zuverlässigkeit von Dashboards und Metriken gestellt. Und wir im Analytics-Team bemühen uns, Probleme zu identifizieren und zu beheben, bevor sie gemeldet werden.
Wie Sie wissen, ist es einfacher zu verhindern, und deshalb habe ich mich entschlossen, das Problem systematisch und proaktiv anzugehen. Und natürlich habe ich als erstes einen Slack- Kanal erstellt , in den ich die Zustellung von Benachrichtigungen über Fehler in unseren Pipelines eingerichtet habe.
Vertrauen in die Relevanz von Data Marts
, :
10
8
DWH
, QA :
,
:
.yml freshness:
freshness:
warn_after: {count: 4, period: hour}
error_after: {count: 8, period: hour}
loaded_at_field: "__etl_loaded_at"
SQL-:
select
max({{ loaded_at_field }}) as max_loaded_at,
{{ current_timestamp() }} as snapshotted_at
from {{ source }}
where {{ filter }}
:
, , :
(edge cases),
(bottleneck)
:
: , Out of Memory, Disk Full
SLA
:
, + ( )
CPU
- IO, network
.
:
,
:
+pre-hook: "{{ logging.log_model_start_event() }}"
+post-hook: "{{ logging.log_model_end_event() }}"
, , . - , , , , PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE.
DWH . . .. , .
:
(NULL) , ?
(UNIQUE ID )?
(PRIMARY - FOREIGN KEYS)?
, (ACCEPTED VALUES)?
QA :
,
:
.yml tests:
- name: dim_cars
description: Wheely partners cars.
columns:
- name: car_id
tests:
- not_null
- unique
- name: status
tests:
- not_null
- accepted_values:
values: ['deleted', 'unknown', 'active', 'end_of_life', 'pending', 'rejected'
, 'blocked', 'expired_docs', 'partner_blocked', 'new_partner']
SQL-
-- NOT NULL test
select count(*) as validation_errors
from "wheely"."dbt_test"."dim_cars"
where car_id is null
-- UNIQUE test
select count(*) as validation_errors
from (
select
car_id
from "wheely"."dbt_test"."dim_cars"
where car_id is not null
group by car_id
having count(*) > 1
) validation_errors
-- ACCEPTED VALUES test
with all_values as (
select distinct
status as value_field
from "wheely"."dbt_test"."dim_cars"
),
validation_errors as (
select
value_field
from all_values
where value_field not in (
'deleted','unknown','active','end_of_life','pending','rejected','blocked','expired_docs','partner_blocked','new_partner'
)
)
select count(*) as validation_errors
from validation_errors
-
- - , . -, .
:
,
%
( ), .
QA :
, -.
:
SQL ,
SQL-
(PASSED) 0 , (FAILED) >= 1
Continuous Integration - DWH
, . DWH . . , , , PROD- PR Merge:
DEV- PROD-
(, Out of Memory)
- Continuous Integration (CI). !
:
master- PROD- DWH .
:
CI (, PROD-, 7 )
feature- master
- DWH
( ) :
DWH ,
(, , ) --
, , (, ).
:
, () .
, :
, : , , (, , ), (, , ).
,
DWH
drill-down :
, . , :
,
Continuous Integration and Testing
( )
, Wheely. , .
, , , «Data Engineer» OTUS, .
4 20:00 «Data Engineer». OTUS , .
:
Data Build Tool - DBT
How to get started with data testing - dbt discourse
Manual Work is a Bug - DRY