Logstash gir en kraftig måte å hente, bearbeide og sende data fra forskjellige kilder til Elasticsearch eller andre systemer. Når du integrerer Logstash i din datainnsamlings- og bearbeidingsinfrastruktur, åpner det for avanserte muligheter for dataflyt og prosessering. Den gir flere fordeler, blant annet høy fleksibilitet i dataene du kan hente, muligheten til å definere databehandlingspipelines som kan håndtere store datamengder med høy pålitelighet, og det støtter et bredt spekter av kilder og destinasjoner.

En vanlig praksis ved bruk av Logstash er å definere en serie av konfigurasjoner i en pipeline, som bestemmer hvordan data skal hentes, filtreres, transformeres og sendes videre. Dette kan være alt fra en enkel CSV-eksport til et komplekst datasett som krever flere steg for å bli strukturert og klargjort for analyse.

En typisk prosess for å sette opp en Logstash-pipeline involverer fire hovedtrinn: konfigurasjon av datainngang, datafiltrering og transformasjon, og til slutt definisjon av utdata. Dette gir mulighet til å tilpasse dataene slik at de er klare for visualisering eller videre analyse i verktøy som Elasticsearch og Kibana. Denne artikkelen tar deg gjennom hvordan du setter opp en pipeline for sanntidsdata fra Rennes’ trafikkinformasjon, som kan brukes som et eksempel på hvordan man integrerer eksterne data i en Logstash-pipeline.

For å begynne må du først ha installert Logstash på systemet ditt. Dette kan gjøres på flere måter, men den vanligste er å laste ned og installere Logstash-pakken som passer for ditt operativsystem, som DEB for Debian-baserte systemer. Når Logstash er installert, kan du begynne å definere konfigurasjonen for pipeline.

Første steg i prosessen er å lage en konfigurasjonsfil. På Debian-systemer vil denne filen ligge i katalogen /etc/logstash/conf.d/. I konfigurasjonen definerer vi hvordan Logstash skal hente data, bearbeide dem og sende dem til ønsket destinasjon. I vårt tilfelle vil vi hente trafikkinformasjon fra Rennes hver 10. minutt, bearbeide dataene og sende dem til Elastic Cloud.

Konfigurere inngangsplugin

Først definerer vi hva som skal være kilden for dataene våre. I dette tilfellet bruker vi http_poller-pluginen til å hente CSV-data fra en offentlig API som gir sanntids trafikkdata. Denne pluginen lar oss sette opp en planlagt henting av data hvert 10. minutt. Konfigurasjonen ser slik ut:

javascript
input {
http_poller { urls => { rennes_data_url => "https://data.rennesmetropole.fr/explore/dataset/etat-du-trafic-en-temps-reel/download?format=csv&timezone=Europe/Paris&use_labels_for_header=false" } request_timeout => 60 schedule => { every => "10m" } codec => "line" } }

Bearbeide dataene

Etter å ha hentet dataene, er neste steg å bearbeide dem slik at de kan brukes videre. Dette skjer i filterseksjonen av konfigurasjonsfilen. I vårt tilfelle bruker vi flere forskjellige filtre for å håndtere de forskjellige datatyper:

  1. CSV-filtrering: Her definerer vi hvordan dataene skal parses, hvilke kolonner som er relevante, og fjerner unødvendige felter.

  2. Datoformatering: Vi konverterer tidspunktene i datasettet til et format som kan brukes av Elasticsearch.

  3. Mutasjon: Vi legger til felter som «oneway» for å indikere om en vei er ensrettet, og vi endrer navn på feltene i henhold til vår ønskede datamodell.

Konfigurasjonen kan se slik ut:

javascript
filter {
csv { separator => ";" skip_header => "true" columns => [ "datetime","predefinedlocationreference","averagevehiclespeed","traveltime",
"traveltimereliability","trafficstatus","vehicleprobemeasurement","geo_point_2d",
"geo_shape","gml_id","id_rva_troncon_fcd_v1_1","hierarchie","hierarchie_dv","denomination", "insee","sens_circule","vitesse_maxi" ] remove_field => ["geo_shape", "gml_id", "id_rva_troncon_fcd_v1_1"] } date { match => ["datetime", "UNIX"] target => "@timestamp" } mutate { add_field => { "oneway" => "true" } } mutate { rename => { "traveltime" => "traveltime.duration" } remove_field => ["datetime","message","path","host","@version","original","event.original","tags","sens_circule"] } }

Definere utdata

Til slutt definerer vi hvordan de behandlede dataene skal sendes videre. Her setter vi opp to utdata: den ene for å sende dataene til Elastic Cloud og den andre for å skrive ut til konsollen for feilsøking. Konfigurasjonen for utdata kan se slik ut:

javascript
output {
elasticsearch { cloud_id => "CLOUD_ID" cloud_auth => "user:password" data_stream => true data_stream_type => "metrics" data_stream_dataset => "rennes_traffic" data_stream_namespace => "default" } stdout { codec => rubydebug } }

Starte Logstash

Når konfigurasjonsfilen er på plass, kan du starte Logstash-tjenesten med følgende kommando (på Debian):

sql
sudo systemctl start logstash.service

Etter at Logstash er i gang, kan du sjekke at dataene er blitt hentet og behandlet riktig ved å lage en datavisning i Kibana. Dette gjør du ved å gå til Kibana, navigere til "Stack Management" > "Data Views" og opprette en ny datavisning for datastrømmen metrics-rennes_traffic-default. Deretter kan du bruke Kibana til å utforske og visualisere trafikkinformasjonen.

For å sikre at prosessen fungerer optimalt, er det viktig å vurdere flere faktorer som påvirker påliteligheten og effektiviteten i din pipeline. Blant annet bør du sørge for at alle nødvendige datakilder er tilgjengelige og at de nødvendige tilkoblingene til systemene (som Elastic Cloud) er riktig konfigurert. Videre er det nyttig å kontinuerlig overvåke ytelsen til Logstash, spesielt når du behandler store datamengder i sanntid, da det kan oppstå flaskehalser eller ytelsesproblemer ved høy trafikk.

Hvordan bygge en avansert spørsmåls- og svarapplikasjon med generativ AI og Elasticsearch

I utviklingen av spørsmåls- og svarapplikasjoner med generativ AI er det mange faktorer som spiller inn, spesielt når det kommer til hvordan man henter og bearbeider data fra eksterne kilder som Elasticsearch. I denne sammenhengen er det viktig å forstå hvordan man kan kombinere ulike søkestrategier, som den hybride tilnærmingen som benytter seg av både BM25 og k-NN søk, for å hente relevant informasjon effektivt. Når dokumentene som brukes i applikasjonen ikke er optimalt strukturert for de forventningene som LangChain setter, må det utvikles tilpassede funksjoner for å bygge både dokumentene og forespørslene på en måte som fungerer bedre med systemet.

En viktig komponent i denne prosessen er definisjonen av en custom_document_builder funksjon som gjør det mulig å tilpasse hvordan hvert dokument bygges, basert på data hentet fra Elasticsearch. På samme måte er custom_query_builder avgjørende for å skreddersy spørsmålet som skal benyttes til å hente dokumenter fra Elasticsearch. Dette gir mer presis kontroll over hva slags data som blir hentet ut og hvordan disse skal brukes til å generere svar på brukerens spørsmål.

For å sørge for at den generative AI-modellen kun bruker informasjonen hentet fra dokumentene som ble samlet inn, er det viktig å sette opp et presist system for hvordan disse dokumentene skal presenteres til modellen. I dette tilfellet benytter man en promptmal (LLM_CONTEXT_PROMPT) som setter rammene for hvordan modellen skal svare. Dette promptet spesifiserer at modellen kun skal bruke den hentede informasjonen, og dersom spørsmålet ikke kan besvares med den tilgjengelige konteksten, skal den rett og slett svare med at den ikke vet.

Når man bygger applikasjonen videre, kan man benytte et konsept kalt en "chain" i LangChain. Dette er en sekvens av kall til ulike byggeklosser, som for eksempel spørsmålsbesvarelse, hentingsskritt eller andre verktøy. I applikasjonen vi diskuterer her, defineres "chain" ved en funksjon som samler sammen konteksten, promptet, spørsmålet og svaret, og sørger for at man får den ønskede responsen fra AI-modellen.

I tillegg til det tekniske aspektet av selve spørsmåls- og svarmekanismen, er det viktig å tilpasse innstillingene som påvirker hvordan AI-modellen responderer på spørsmålene. Gjennom en konfigurasjonsmeny i applikasjonen kan brukeren velge hvilken modell de ønsker å bruke, justere temperaturinnstillingen (som styrer graden av variasjon i svarene) og bestemme andre parametere som antall dokumenter som skal hentes, samt andre innstillinger knyttet til søkeoptimalisering. Denne fleksibiliteten gir en betydelig kontroll over hvordan applikasjonen presterer, og gjør det mulig å tilpasse resultatene etter spesifikke behov.

Videre finnes det flere interessante tilnærminger for å forbedre søkefunksjonaliteten i applikasjoner som benytter Elasticsearch som vektorbutikk. En tilnærming er å bruke en "self-querying retriever" som omdanner brukerens spørsmål til en strukturert forespørsel som kan kjøres direkte mot Elasticsearch-indeksen. Dette kan være spesielt nyttig når dokumentene har en spesifikk struktur som gjør det vanskelig å bruke generelle spørsmål. En annen tilnærming er å benytte "MultiQueryRetriever", som genererer flere spørsmål fra det opprinnelige spørsmålet, for å hente informasjon fra Elasticsearch fra forskjellige perspektiver. Denne metoden øker sjansen for å hente inn mer relevant og variert informasjon, som kan berike svaret modellen gir.

I tillegg til de nevnte metodene, er det viktig å merke seg hvordan dokumentene behandles før de benyttes i en applikasjon. Når man bruker store mengder tekstdata, som i tilfelle en filbase som inneholder informasjon om filmer, er det avgjørende å dele opp dokumentene i mindre deler (chunking). Dette gjør det lettere for applikasjonen å hente spesifik informasjon på en mer effektiv måte. Chunking gir muligheten til å indeksere og hente spesifikke deler av informasjonen uten å måtte hente hele dokumentet, noe som kan være spesielt nyttig for komplekse spørsmål.

For å lage en chatbot-applikasjon, som kan forstå og håndtere mer komplekse samtaler, er det nødvendig med ytterligere utvikling av samtaleloggikk. Ved å bruke LangChain til å utvikle et mer avansert samtaleforløp, kan man gjøre chatbotten i stand til å forstå kontekst og holde samtalen i gang på en naturlig måte. Dette er essensielt for å kunne bygge en chatbot som ikke bare kan svare på enkle spørsmål, men også håndtere åpne og dynamiske samtaler med brukeren. Denne typen integrasjon mellom spørsmålsbesvarelse og samtalehåndtering er nøkkelen til å utvikle en applikasjon som kan håndtere komplekse oppgaver og gi mer menneskelignende interaksjoner.

Å forstå hvordan man kan kombinere flere teknikker, som for eksempel avansert prompt-design, tilpassede forespørsler og dynamisk samtaleforløp, er essensielt for utviklingen av et robust og produksjonsklart RAG-system. Det er også viktig å være klar over at forskjellige tilnærminger til søk og spørring kan gi svært forskjellige resultater, og det er ofte nødvendig med eksperimentering for å finne den løsningen som fungerer best for det spesifikke formålet.

Hvordan fungerer SSO med OpenID Connect og Okta?

I konteksten av Single Sign-On (SSO) ved bruk av OpenID Connect (OIDC) med Okta som autentiseringstjeneste (OP), følger interaksjonen mellom Elasticsearch og Okta et spesifikt flyt, som involverer både autentisering og autorisasjon. Denne flyten sikrer at brukere kan logge på systemer som Kibana ved hjelp av et eksternt autentiseringstjeneste, uten å måtte administrere flere separate innloggingsdata.

Først, når en bruker forsøker å få tilgang til Kibana, blir autentiseringen ikke håndtert direkte av Elasticsearch. I stedet blir brukeren omdirigert til Okta, som fungerer som autentiseringstjeneste (OP). Brukeren logger inn med sine Okta-legitimasjonsbeskrivelser, og Okta returnerer en ID-token og en tilgangstoken tilbake til Elasticsearch. ID-tokenet inneholder brukerens identitetsinformasjon, mens tilgangstokenet kan benyttes for å få tilgang til ytterligere ressurser eller detaljer om brukeren innenfor Okta.

Elasticsearch, som fungerer som den pålitelige parten (RP), verifiserer disse tokenene ved å sjekke deres gyldighet med Okta. Når verifikasjonen er fullført, blir brukeren tildelt tilgang til de nødvendige tjenestene basert på informasjonen i tokenet, som brukerens identitet og medlemskap i grupper. Denne prosessen forenkler autentisering ved å sentralisere brukerlegitimasjonene i Okta og gir samtidig en forbedret brukeropplevelse ved å redusere behovet for flere pålogginger.

Et viktig aspekt ved denne prosessen er håndteringen av krav (claims). I konfigurasjonen av Elasticsearch blir nødvendige krav ofte spesifisert på forhånd, som for eksempel "openid", "groups", "profile" og "email". Disse kravene er definert for å hente ut spesifik informasjon om brukeren fra Okta. I et praktisk scenario er det viktig å forstå at kravene som støttes kan variere betydelig avhengig av hvilken OpenID Connect-leverandør som benyttes.

For en mer effektiv håndtering og testing av disse kravene, kan verktøyet oidc-tester være svært nyttig. Dette verktøyet gjør det mulig å visualisere innholdet i ID-tokenet, slik at man kan se hvilke krav og informasjon som er inkludert. Dette kan være spesielt nyttig for utviklere som ønsker å mappe kravene til brukerens profil i systemet.

En annen ofte oversett detalj er hvordan man kan gjøre innloggingsopplevelsen mer brukervennlig ved å tilpasse grensesnittet. For eksempel, hvis du ønsker å legge til et logo ved siden av SSO-realmene på innloggingssiden, kan dette gjøres ved å oppdatere Kibana-konfigurasjonen for å inkludere et ikon. Dette kan enten være standardlogoen for Elastic Stack eller et egendefinert logo via en URL for et SVG-bilde. Slike små justeringer kan bidra til å gjøre autentiseringsprosessen mer visuell og tilpasset brukerens organisasjon eller merkevare.

Under implementeringen er det også viktig å være klar over at autentisering ikke nødvendigvis gir umiddelbar tilgang til de ulike tjenestene. Et vanlig problem som kan oppstå, er at brukere som er autentisert gjennom Okta, ikke har nødvendige roller tildelt i Kibana. For å løse dette, må man konfigurere roller og tillatelser korrekt i Elasticsearch og Kibana etter at autentiseringen er gjennomført. Dette kan innebære en systematisk gjennomgang av hvordan grupper i Okta kartlegges til roller i Kibana for å sikre at de riktige brukerne får tilgang til de nødvendige ressursene.

Alt i alt gjør SSO via OpenID Connect med Okta til et kraftig verktøy for å forbedre både sikkerheten og brukeropplevelsen. Ved å delegere autentiseringen til en pålitelig tredjepart som Okta, minimeres risikoen for dårlig sikkerhetshåndtering i applikasjoner. For organisasjoner som ønsker å tilby sine brukere en mer strømlinjeformet og sikker tilgang til tjenester som Kibana, er det avgjørende å forstå hvordan denne flyten fungerer og hvordan man kan konfigurere den på riktig måte.

Hvordan optimalisere tidsseriedata med nedprøving: En praktisk tilnærming for forbedret ytelse og lagringshåndtering

Når man arbeider med tidsseriedata, er nedprøving (downsampling) en teknikk som kan være avgjørende for både lagringsbesparelser og ytelsesforbedringer. Denne prosessen involverer å redusere datakvaliteten over tid ved å samle data til et lavere tidsintervall. For eksempel kan data som samles inn hvert sekund, bli nedprøvd til et fem-minutters intervall. Denne tilnærmingen er særlig nyttig i systemer som håndterer store mengder data, som Kubernetes, hvor informasjonen kan være svært dynamisk, men der full detaljering av dataene ikke alltid er nødvendig for analyseformål.

I denne konteksten er Elastic Stack et kraftig verktøy som gjør det mulig å bruke nedprøving på tidsseriedata for å oppnå bedre ytelse og redusert lagringsbehov. I eksempelet med Kubernetes-klustret som er beskrevet i denne oppskriften, er formålet å undersøke hvordan nedprøving påvirker visualiseringen av CPU- og minnebruk over tid. Ved å bruke nedprøving på disse dataene, kan man beholde den overordnede nøyaktigheten i analysene, selv når dataene er betydelig komprimert, noe som gir en mer effektiv drift.

For at nedprøving skal være effektivt, er det viktig at Elastic Agent-integrasjonen støtter tidsseriedata (TSDS). Dette kan verifiseres ved å sjekke integrasjonens changelog i Kibana, der det spesifikt vil stå om TSDS-støtte er tilgjengelig. For eksempel, i Kubernetes-integrasjonen kan TSDS støtte være eksplisitt dokumentert. Denne informasjonen er avgjørende for å forstå om nedprøving kan implementeres på en bestemt type data.

Nedprøving er sterkt knyttet til bruken av ILM (Index Lifecycle Management)-politikker i Elastic Stack. ILM-politikker bestemmer hvordan data blir håndtert gjennom livssyklusen, fra "hot" fase, hvor dataene er nylige og detaljert, til "cold" fase, hvor dataene blir mer kompakte og lagret med lavere oppløsning. I praksis kan dette bety at data i den "hotte" fasen lagres uten nedprøving, mens data i den "varme" fasen blir nedprøvd til time-intervall og i den "kalde" fasen til daglige intervaller. Dette gir en fleksibel og effektiv måte å håndtere lagringskravene på, samtidig som man opprettholder tilgjengeligheten til de viktigste dataene i sanntid.

For å tilpasse disse ILM-politikkene for tidsseriedata, kan man gå til Kibana’s Stack Management-seksjon og navigere til Index Lifecycle Policies. Derfra kan man enkelt finne de innebygde ILM-politikkene som allerede er i bruk, og gjøre nødvendige tilpasninger. Det er også mulig å konfigurere ulike nedprøvingsintervall for ulike faser av dataens livssyklus, noe som gir en dynamisk tilnærming til databehandling.

Ved å bruke nedprøving kan man ikke bare optimalisere ytelsen, men også redusere kostnadene knyttet til lagring. Et praktisk eksempel på dette kan være å definere nedprøvingsstrategier for ulike tidsfaser: I den "varme" fasen kan dataene bli nedprøvd med ett minutts intervall, i den "kalde" fasen kan intervallet økes til én dag. Denne metodikken kan implementeres for å sikre at systemet både opprettholder nødvendig detaljert informasjon i sanntid, samtidig som eldre data er komprimert for effektiv lagring.

En annen viktig komponent i datastyring er Snapshot Lifecycle Management (SLM). Denne funksjonen i Elastic Stack gjør det mulig å automatisk ta sikkerhetskopier (snapshots) av systemet, noe som er avgjørende for å sikre kontinuitet og gjenoppretting ved eventuelle systemfeil. SLM kan konfigureres til å ta daglige snapshots av loggdata og beholde dem i en spesifisert periode, for eksempel 30 dager. Dette gir en enkel, automatisert måte å administrere datagjenoppretting uten å måtte gjøre dette manuelt. For å gjøre prosessen enda mer robust kan du sette opp varsler som alerter deg ved feil i snapshot-policyene, slik at du raskt kan reagere på eventuelle problemer.

Det er essensielt å forstå at nedprøving ikke bare handler om å redusere mengden data, men også om å bevare den analytiske verdien av de nedprøvde dataene. Ved å bruke en balansert tilnærming mellom datakomprimering og datakvalitet kan systemer optimalisere både ytelse og lagring. Denne balansen er avgjørende for effektiv databehandling i miljøer med høy datagenerering, som Kubernetes. Integrasjonen av nedprøving og ILM-politikkene gir et kraftig verktøy for å håndtere tidens og datamengdens utfordringer på en effektiv måte, samtidig som man opprettholder nødvendige nivåer av innsikt og tilgjengelighet.