Ifm. driftstansen, og driftsproblemene i etterkant, i Kildomaten fra 12. mai kl. 15.00 til 14. mai kl. 13.00 så kan det være team som ønsker å sjekke om det kom inn filer i kildebøtta som ikke trigget Kildomaten. I denne artikkelen så finner man eksempelkode for å gjøre denne sjekken.
Hvis teamet ønsker hjelp til å validere om Kildomaten har prosessert alle filer, så kan man ta kontakt med Kundeservice.
Sjekke kildebøtta
Det første man bør gjøre er å sjekke om det, i tidsintevallet for driftsstansen, har blitt skrevet filer til mapper i kildebøtta som vanligvis trigger Kildomaten-jobber. Har det ikke skjedd blitt skrevet filer, så trenger man ikke å gjøre noe mer.
Sjekken kan gjøres av en data-admins på teamet på følgende måte:
- Åpne Jupyter på Dapla Lab
- Under tjenestekonfigurasjonen for Jupyter velger du å representere data-admins for det aktuelle teamet
- Åpne en notebook og velg en kernel som har Python-pakken gcsfs installert. Hvis du ikke har en slik kernel kan du opprette et ssb-project fra terminalen med kommandoen
ssb-project create test
, gå inn i mappen og installere pakken ved å skrivepoetry add gcsfs
. Da vil kernelen du skal velge hete test. - Kjør denne koden etter at du har endret verdiene til variablene
source_bucket
ogsource_folder
:
Notebook
from datetime import datetime
from gcsfs import GCSFileSystem
import pytz
= pytz.UTC
utc
= "gs://ssb-dapla-felles-kilde-prod"
source_bucket = "freg"
source_folder
= datetime(year=2025, month= 5, day=12, hour=15)
filter_start_date = datetime(year=2025, month=5, day=14, hour=13)
filter_end_date
def is_file_modified_on_date(file_path: str) -> bool:
"""
Returns True if file at file path was modified on the date "filter_date", returns False otherwise
"""
= GCSFileSystem().info(path=file_path)
file_info | None = file_info.get("mtime")
modified_date: datetime if not isinstance(modified_date, datetime):
return False
return modified_date < utc.localize(
filter_end_dateand modified_date > utc.localize(filter_start_date)
)
= GCSFileSystem().find(
source_files =f"{source_bucket}/{source_folder}", maxdepth=None, withdirs=False
path
)= [f for f in source_files if is_file_modified_on_date(f) is True]
source_files_at_date
print(f"Source files found between date {str(filter_start_date)} and {str(filter_end_date)}:")
print(source_files_at_date)
Hvis man kjører koden over og den returnerer en tom liste så har man verifisert at det ikke ble skrevet noen filer til mappen under driftsstansen. Hvis koden returnerer en liste med filnavn så bør man undersøke om filene ble prosessert av Kildomaten eller ikke.
Verifisere produktbøtta
Når man har en liste med filnavn som ble skrevet til kildebøtta i tidsperioden med driftsstans, så må man verifisere om filene ble skrevet til produktbøtta som forventet. Hvordan man gjør dette vil avhenge av logikken i teamets kildomaten-skript. Hvis Kildomaten-skriptet skriver en fil til produktbøtta med samme filnavn som er brukt i kildebøtta, så kan man verfisere at samme fil også finne i kildebøtta. Hvis Kildomaten-skriptet endrer navnet, så må man først gjenskape det nye navnet, og deretter verifisere.
For å verifisere om filen er prosessert må man gjøre følgende:
- hente ut liste med filer fra forrige steg (krever innloggin som data-admins i Dapla Lab)
- åpne en ny tjeneste i Dapla Lab som developers og kopiere over listen fra tjenesten man åpnet som data-admins.
- åpne en notebook og velg en kernel som har Python-pakken gcsfs installert. Hvis du ikke har en slik kernel kan du opprette et ssb-project fra terminalen med kommandoen
ssb-project create test
, gå inn i mappen og installere pakken ved å skrivepoetry add gcsfs
. Da vil kernelen du skal velge hete test. - Kjør koden under, der
source_files_at_date
er listen du kopierte over fra Sjekke kildebøtta-delen. I tillegg må du oppgi hvilken bøtte som skal sjekkes underbucket
, og hvilken undermappe i bøtta som det skal søkes gjennom ifolder
.
from gcsfs import GCSFileSystem
# Denne listen inneholder filnavnene vi identifiserte tidligere
= [
source_files_at_date 'ssb-etlev-data-kilde-prod/kildetilgang/access-grant_abc.json',
'ssb-etlev-data-kilde-prod/kildetilgang/access-grant_def.json',]
# Disse variablene må brukeren oppgi selv
= "gs://my-bucket-name"
bucket = "my/folder/name"
folder
def find_missing_files(bucket_name: str, folder_name: str, source_files: list[str]) -> list[str]:
= [f.split(sep="/")[-1].split(sep=".")[0] for f in source_files]
file_names
= "" if "gs://" in bucket_name else "gs://"
fs_prefix = f"{fs_prefix}{bucket_name}/{folder_name}"
fs_path = GCSFileSystem()
fs
= []
missing_files
for i, f in enumerate(file_names):
= fs.glob(f"{fs_path}/**/{f}.*")
found if len(found) == 0:
= f"gs://{source_files[i]}" if "gs://" not in source_files[i] else source_files[i]
source_file
missing_files.append(source_file)
return missing_files
find_missing_files(=bucket,
bucket_name=folder,
folder_name=source_files_at_date) source_files
Funksjonen over returnerer alle filer den ikke finner på den oppgitte stien, og som derfor ikke er prosessert av Kildomaten. I kapitlet som heter Trigge prosessering manuelt finner du en beskrivelse av hvordan man trigger prosesseringen av disse filene manuelt.
Fra Altinn3 til ISEE
Statistikkproduksjoner som har datafangst fra Altinn3 og synkroniserer filer prosessert med Kildomaten ned til ISEE, må selv hente ut en liste over hvilke filer som er lastet til ISEE. En fremgangsmåte er sammenligne hvilke filer som innkvittert i SFU med hva som ligger i ISEE-databasen. Disse kan identifiseres ved deres unike referansenummer i SFU. Hvis man har en liste med referansenummer som finnes i SFU, men ikke i ISEE, så kan søke etter disse filene i kildebøtta.
Ta kontakt med Kundeservice dersom man ønsker hjelp til dette.
Trigge prosessering manuelt
Hvis koden i forrige avsnitt returnerte en liste med filer, så kan man manuelt trigge prosessering av disse filene med Kildomaten.
For å trigge Kildomaten manuelt må man være logget inn som data-admins i en Dapla Lab tjeneste. Det betyr at man kan liste ut alle filer som ble skrevet i et gitt tidspunkt, og trigge prosesseringen av disse i samme notebook eller script. Men man må oppgi project_id
for standardprosjektet (ikke kildeprosjektet) i koden under, noe som kan være forvirrende for brukeren. Dette er planlagt endret slik at det blir lettere bruke fremover.
Koden i forrige avsnitt returnerte en liste med alle filer som heter source_files_at_date
, og vi kan loope over disse og trigge prosesseringen. For å gjøre dette må du først fylle inn riktig verdier for project-id
og source_name
.
- project-id for standardprosjektet. Slik finner du prosjekt-id. Merk at dette ikke er kilde-prosjektet!
- source_name er navnet på mappen i iac-repoet hvor kilden du skal trigge er definert. Navnet på kilden i eksempelet med team dapla-example var
altinn
.
Notebook
from dapla import trigger_source_data_processing
# Brukeren fyller inn her
= ""
project_id = ""
source_name
# Fjerner bøttenavn fra filstier
= [path.split('/', 1)[1] if '/' in path else path for path in source_files_at_date]
stripped_paths
# Trigger prosessering for alle filer i listen
for file in stripped_paths:
file, kuben=True) trigger_source_data_processing(project_id, source_name,