Faites confiance à vos yeux et à ce que vous voyez sur le tableau de bord
Chez Wheely , nous nous appuyons fortement sur les données pour prendre des décisions opérationnelles et stratégiques. Du paiement de bonus hebdomadaires aux partenaires à l'expansion dans d'autres villes et pays.
Chaque manager ou Product Owner connaît intimement son domaine et tout écart peut soulever des questions. Par conséquent, des exigences accrues sont imposées à la fiabilité des tableaux de bord et des métriques. Et nous, membres de l'équipe Analytics, nous efforçons d'identifier et de résoudre les problèmes avant qu'ils ne soient signalés.
Comme vous le savez, il est plus facile de prévenir, c'est pourquoi j'ai décidé d'aborder le problème de manière systématique et proactive. Et, bien sûr, la première chose que j'ai faite a été de créer un canal Slack , dans lequel j'ai configuré la livraison de notifications sur les erreurs dans nos pipelines.
Confiance dans la pertinence des 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