Bereik

Grow

Manage

Automate

Bereik

Grow

Manage

Automate

Een dashboardtool met Bird API's

Zachary Samuels

24 mrt 2022

E-mail

1 min read

Een dashboardtool met Bird API's

Zachary Samuels

24 mrt 2022

E-mail

1 min read

Een dashboardtool met Bird API's

Dit script raakt slechts de oppervlakte van wat mogelijk is met behulp van Python, Plotly Dash en onze API's.

Bijna een jaar geleden schreef Tom Mairs, de directeur van klantensucces van Bird, een tool voor e-mails met behulp van Bird API's. In dit bericht neem ik het stokje over waar hij was gestopt. Zijn tool staat toe dat taken volgens schema worden verzonden, maar wat als we onze eigen dashboards en gebeurtenislogboeken willen creëren?




Mogelijk wil ik een specifiek dashboard maken voor een bedrijfsgroep of een klantgericht dashboard, maar gebruikers geen volledige toegang geven tot de Bird-UI. Dit script raakt slechts het oppervlak van wat mogelijk is met behulp van Python, Plotly Dash, en onze API's.




Toen ik mijn zoektocht online begon, wilde ik de weg van de minste weerstand vinden. Ik had alle dashboards en de UI zelf kunnen maken in HTML en python, maar na wat Google-zoekopdrachten kwam ik Plotly’s Dash tegen, dat gemakkelijk integreert met python. Ik koos voor Dash om twee redenen: 1) het is open source, en 2) na het lezen van de documentatie leek het gemakkelijk aanpasbaar voor wat ik probeerde te doen. Dash is een open-sourcebibliotheek die ideaal is voor het bouwen en inzetten van data-apps met aangepaste gebruikersinterfaces. Dit maakte het creëren van een UI uiterst eenvoudig. De vraag werd toen, hoe complex wilde ik deze app maken? Hoe meer tijd ik besteedde, hoe meer functies ik wilde toevoegen.




Voor het eerste project wilde ik ervoor zorgen dat ik een dashboard had met aanpasbare meetwaarden en een selecteerbaar tijdsbestek. Aanvankelijk begon ik met een dashboard waar je slechts één meetwaarde kon kiezen uit de dropdown. Toen ik feedback kreeg van collega's, verfijnde ik het dashboard een beetje om multi-sectie en astitels toe te voegen. Ik besloot ook een extra tabblad voor een gebeurtenislogboek toe te voegen. Ik bereikte het punt waar ik tevreden was met wat ik had als een goede basis voor iedereen die zijn eigen dashboards wil bouwen. Natuurlijk zette ik het project op Github zodat je het kunt klonen of vertakken.

Aan de slag

Om toegang te krijgen tot deze app, moet je ervoor zorgen dat je python 3.10 of hoger draait en de volgende bibliotheken installeert:

  • requests

  • dash

  • pandas




Voer vervolgens je API-sleutel in App.py in en voer de app uit. Het zal draaien op http://localhost:8050. Voor meer informatie over het implementeren hiervan op een openbaar toegankelijke server (zoals AWS), zie de volgende bronnen:

De Dashboard Pagina Creëren

Ten eerste, initialiseer het data frame en het dashboard. Zonder het dashboard te initialiseren, zal er geen dashboard in de gebruikersinterface verschijnen.




df = pd.DataFrame({

"Count": [0,0],

"Time": [0,0]

})

fig = px.line(df,x="Time",y="Count")




Bouw vervolgens de eerste tab uit. Dit is een combinatie van een app callback (om te controleren welke tab wordt gebruikt); samen met een conditionele functie om te controleren welke tab momenteel is geselecteerd. De onderstaande code bouwt alleen het lege dashboard en de UI-elementen op (we komen later bij de gebeurtenissen-tab). De dcc-elementen zijn de Dash Core Components en de HTML Components maken gemakkelijk gebruik van HTML in de gebruikersinterface mogelijk.




html.H2('Analytics Dashboard'),

#Multi-select dropdown

dcc.Dropdown(['Count Accepted','Count Admin Bounce','Count Block Bounce','Count Bounce','Count Clicked','Count Delayed', 'Count Delayed First','Count Delivered','Count Delivered First','Count Delivered Subsequent','Count Generation Failed', 'Count Generation Rejection','Count Hard Bounce','Count Inband Bounce','Count Initial Rendered','Count Injected', 'Count Out of Band Bounce', 'Count Policy Rejection','Count Rejected','Count Rendered','Count Sent','Count Soft Bounce', 'Count Spam Complaint','Count Targeted','Count Undetermined Bounce','Count Unique Clicked','Count Unique Confirmed Opened', 'Count Unique Initial Rendered','Count Unique Rendered','Count Unsubscribe','Total Delivery Time First','Total Delivery Time Subsequent', 'Total Message Volume'], id="y-axis", multi=True, searchable=True, placeholder="Select metrics(s)"),

#Datum selector (maximaal toegestane datum is ingesteld op de datum van vandaag) dcc.DatePickerRange( id='date-picker-range', start_date=date(2022,1,1), end_date=date(2022, 2, 1), max_date_allowed=date(datetime.today().year,datetime.today().month,datetime.today().day), ),

#Grafiek object dcc.Graph( id='Emails', figure=fig )




Let op hoe eenvoudig het is om een dashboard gebruikersinterface te creëren met een multi-select, doorzoekbare dropdown in dash. Om multi-select of zoeken uit te schakelen, kunnen de parameters voor het creëren van een dropdown gemakkelijk worden aangepast. Ik vond dat het meest complexe deel van dit project het opzetten van het daadwerkelijke data frame was op basis van inputs, evenals het correct laten werken van de HTML + CSS in de gebruikersinterface.




De Time Series Metrics API maakt het mogelijk om 33 individuele metrieken op te halen op basis van een datum/tijd bereik. Je kunt dieper filteren op Domeinen, Campagnes, IP Pools, Verzenden Domeinen, Subaccounts en de Nauwkeurigheid van tijdreeksgegevens specificeren. Deze extra filters samen met deliverability-analyses zouden een toekomstige verbetering van dit project kunnen zijn (foutafhandeling zou moeten worden geïmplementeerd voor klanten die geen toegang hebben tot deliverability-analyses).




Door het gebruik en het aanroepen van de Metrics API, bouw ik een dashboard met de door de gebruiker geselecteerde parameters en de gespecificeerde tijdsperiode. Het geïnitialiseerde dashboard wordt vervolgens bijgewerkt.




#Bouw de API-oproep met de verstrekte parameters params = { "from" : start_date + "T00:00", "to" : end_date + "T00:00", "delimiter" : ",", "precision" : "day", "metrics" : joined_values } api_url = BASE_URL + "/metrics/deliverability/time-series" response_API = requests.get(api_url, headers = {"Authorization" : API_KEY}, params=params) response_info = json.loads(response_API.text) new_df = pd.json_normalize(response_info, record_path=['results']) value_array = joined_values.split(",") #Bouw een nieuw dashboard op met de nieuwe metrieken en datums van de bijgewerkte API-oproep fig = px.line(new_df, x=new_df['ts'], y=value_array, labels={"value": "Count", "variable": "Metric","ts":"Date"}) fig.update_xaxes(title_text="Time") fig.update_yaxes(title_text="Count") return fig




Het volgende is een voorbeeld van meerdere geselecteerde metrieken en een uitgebreide tijdsperiode.







Opmerking: er zijn veel items automatisch ingebouwd in de dash grafiek (hoveren, zoomen, automatische schaal).

Ten eerste, initialiseer het data frame en het dashboard. Zonder het dashboard te initialiseren, zal er geen dashboard in de gebruikersinterface verschijnen.




df = pd.DataFrame({

"Count": [0,0],

"Time": [0,0]

})

fig = px.line(df,x="Time",y="Count")




Bouw vervolgens de eerste tab uit. Dit is een combinatie van een app callback (om te controleren welke tab wordt gebruikt); samen met een conditionele functie om te controleren welke tab momenteel is geselecteerd. De onderstaande code bouwt alleen het lege dashboard en de UI-elementen op (we komen later bij de gebeurtenissen-tab). De dcc-elementen zijn de Dash Core Components en de HTML Components maken gemakkelijk gebruik van HTML in de gebruikersinterface mogelijk.




html.H2('Analytics Dashboard'),

#Multi-select dropdown

dcc.Dropdown(['Count Accepted','Count Admin Bounce','Count Block Bounce','Count Bounce','Count Clicked','Count Delayed', 'Count Delayed First','Count Delivered','Count Delivered First','Count Delivered Subsequent','Count Generation Failed', 'Count Generation Rejection','Count Hard Bounce','Count Inband Bounce','Count Initial Rendered','Count Injected', 'Count Out of Band Bounce', 'Count Policy Rejection','Count Rejected','Count Rendered','Count Sent','Count Soft Bounce', 'Count Spam Complaint','Count Targeted','Count Undetermined Bounce','Count Unique Clicked','Count Unique Confirmed Opened', 'Count Unique Initial Rendered','Count Unique Rendered','Count Unsubscribe','Total Delivery Time First','Total Delivery Time Subsequent', 'Total Message Volume'], id="y-axis", multi=True, searchable=True, placeholder="Select metrics(s)"),

#Datum selector (maximaal toegestane datum is ingesteld op de datum van vandaag) dcc.DatePickerRange( id='date-picker-range', start_date=date(2022,1,1), end_date=date(2022, 2, 1), max_date_allowed=date(datetime.today().year,datetime.today().month,datetime.today().day), ),

#Grafiek object dcc.Graph( id='Emails', figure=fig )




Let op hoe eenvoudig het is om een dashboard gebruikersinterface te creëren met een multi-select, doorzoekbare dropdown in dash. Om multi-select of zoeken uit te schakelen, kunnen de parameters voor het creëren van een dropdown gemakkelijk worden aangepast. Ik vond dat het meest complexe deel van dit project het opzetten van het daadwerkelijke data frame was op basis van inputs, evenals het correct laten werken van de HTML + CSS in de gebruikersinterface.




De Time Series Metrics API maakt het mogelijk om 33 individuele metrieken op te halen op basis van een datum/tijd bereik. Je kunt dieper filteren op Domeinen, Campagnes, IP Pools, Verzenden Domeinen, Subaccounts en de Nauwkeurigheid van tijdreeksgegevens specificeren. Deze extra filters samen met deliverability-analyses zouden een toekomstige verbetering van dit project kunnen zijn (foutafhandeling zou moeten worden geïmplementeerd voor klanten die geen toegang hebben tot deliverability-analyses).




Door het gebruik en het aanroepen van de Metrics API, bouw ik een dashboard met de door de gebruiker geselecteerde parameters en de gespecificeerde tijdsperiode. Het geïnitialiseerde dashboard wordt vervolgens bijgewerkt.




#Bouw de API-oproep met de verstrekte parameters params = { "from" : start_date + "T00:00", "to" : end_date + "T00:00", "delimiter" : ",", "precision" : "day", "metrics" : joined_values } api_url = BASE_URL + "/metrics/deliverability/time-series" response_API = requests.get(api_url, headers = {"Authorization" : API_KEY}, params=params) response_info = json.loads(response_API.text) new_df = pd.json_normalize(response_info, record_path=['results']) value_array = joined_values.split(",") #Bouw een nieuw dashboard op met de nieuwe metrieken en datums van de bijgewerkte API-oproep fig = px.line(new_df, x=new_df['ts'], y=value_array, labels={"value": "Count", "variable": "Metric","ts":"Date"}) fig.update_xaxes(title_text="Time") fig.update_yaxes(title_text="Count") return fig




Het volgende is een voorbeeld van meerdere geselecteerde metrieken en een uitgebreide tijdsperiode.







Opmerking: er zijn veel items automatisch ingebouwd in de dash grafiek (hoveren, zoomen, automatische schaal).

Ten eerste, initialiseer het data frame en het dashboard. Zonder het dashboard te initialiseren, zal er geen dashboard in de gebruikersinterface verschijnen.




df = pd.DataFrame({

"Count": [0,0],

"Time": [0,0]

})

fig = px.line(df,x="Time",y="Count")




Bouw vervolgens de eerste tab uit. Dit is een combinatie van een app callback (om te controleren welke tab wordt gebruikt); samen met een conditionele functie om te controleren welke tab momenteel is geselecteerd. De onderstaande code bouwt alleen het lege dashboard en de UI-elementen op (we komen later bij de gebeurtenissen-tab). De dcc-elementen zijn de Dash Core Components en de HTML Components maken gemakkelijk gebruik van HTML in de gebruikersinterface mogelijk.




html.H2('Analytics Dashboard'),

#Multi-select dropdown

dcc.Dropdown(['Count Accepted','Count Admin Bounce','Count Block Bounce','Count Bounce','Count Clicked','Count Delayed', 'Count Delayed First','Count Delivered','Count Delivered First','Count Delivered Subsequent','Count Generation Failed', 'Count Generation Rejection','Count Hard Bounce','Count Inband Bounce','Count Initial Rendered','Count Injected', 'Count Out of Band Bounce', 'Count Policy Rejection','Count Rejected','Count Rendered','Count Sent','Count Soft Bounce', 'Count Spam Complaint','Count Targeted','Count Undetermined Bounce','Count Unique Clicked','Count Unique Confirmed Opened', 'Count Unique Initial Rendered','Count Unique Rendered','Count Unsubscribe','Total Delivery Time First','Total Delivery Time Subsequent', 'Total Message Volume'], id="y-axis", multi=True, searchable=True, placeholder="Select metrics(s)"),

#Datum selector (maximaal toegestane datum is ingesteld op de datum van vandaag) dcc.DatePickerRange( id='date-picker-range', start_date=date(2022,1,1), end_date=date(2022, 2, 1), max_date_allowed=date(datetime.today().year,datetime.today().month,datetime.today().day), ),

#Grafiek object dcc.Graph( id='Emails', figure=fig )




Let op hoe eenvoudig het is om een dashboard gebruikersinterface te creëren met een multi-select, doorzoekbare dropdown in dash. Om multi-select of zoeken uit te schakelen, kunnen de parameters voor het creëren van een dropdown gemakkelijk worden aangepast. Ik vond dat het meest complexe deel van dit project het opzetten van het daadwerkelijke data frame was op basis van inputs, evenals het correct laten werken van de HTML + CSS in de gebruikersinterface.




De Time Series Metrics API maakt het mogelijk om 33 individuele metrieken op te halen op basis van een datum/tijd bereik. Je kunt dieper filteren op Domeinen, Campagnes, IP Pools, Verzenden Domeinen, Subaccounts en de Nauwkeurigheid van tijdreeksgegevens specificeren. Deze extra filters samen met deliverability-analyses zouden een toekomstige verbetering van dit project kunnen zijn (foutafhandeling zou moeten worden geïmplementeerd voor klanten die geen toegang hebben tot deliverability-analyses).




Door het gebruik en het aanroepen van de Metrics API, bouw ik een dashboard met de door de gebruiker geselecteerde parameters en de gespecificeerde tijdsperiode. Het geïnitialiseerde dashboard wordt vervolgens bijgewerkt.




#Bouw de API-oproep met de verstrekte parameters params = { "from" : start_date + "T00:00", "to" : end_date + "T00:00", "delimiter" : ",", "precision" : "day", "metrics" : joined_values } api_url = BASE_URL + "/metrics/deliverability/time-series" response_API = requests.get(api_url, headers = {"Authorization" : API_KEY}, params=params) response_info = json.loads(response_API.text) new_df = pd.json_normalize(response_info, record_path=['results']) value_array = joined_values.split(",") #Bouw een nieuw dashboard op met de nieuwe metrieken en datums van de bijgewerkte API-oproep fig = px.line(new_df, x=new_df['ts'], y=value_array, labels={"value": "Count", "variable": "Metric","ts":"Date"}) fig.update_xaxes(title_text="Time") fig.update_yaxes(title_text="Count") return fig




Het volgende is een voorbeeld van meerdere geselecteerde metrieken en een uitgebreide tijdsperiode.







Opmerking: er zijn veel items automatisch ingebouwd in de dash grafiek (hoveren, zoomen, automatische schaal).

Het maken van de Event Details-pagina

De pagina met evenementdetails was wat moeilijker omdat ik niet wist wat de beste manier was om alle evenementmetingen op een gemakkelijk leesbare manier te presenteren. Ik overwoog om filterparameters aan deze pagina toe te voegen, maar ik besloot dat dit een aanzienlijke hoeveelheid tijd aan dit project zou toevoegen, aangezien de tabel dan dynamisch zou moeten zijn (samen met het toevoegen van de parameters, callbacks, enz.). Ik koos ervoor om alle evenementen te tonen en de timestamp eerst te plaatsen (want zonder de timestamp eerst te plaatsen, was de grafiek niet gemakkelijk te lezen). Aanvankelijk ontdekte ik dat met alleen de ruwe HTML de tabel ongelooflijk moeilijk te lezen was. Er waren geen randen en geen kleurverschillen voor de kop versus de rijen. Om de tabel gemakkelijker leesbaar te maken, kon ik CSS binnen Dash gebruiken.




Het idee voor de evenementdetails is bijna hetzelfde als het dashboard, behalve dat ik deze keer de Events API aanroep en alle evenementen binnenhaal. Let op, de evenementdetails toont alleen de 10 meest recente evenementen (met gebruikmaking van de max_rows parameter en API-filtering). Dit kan worden verhoogd, maar ik koos ervoor om de 10 meest recente evenementen te tonen omdat hoe meer evenementen er getoond worden, hoe langer de API-oproep duurt. Een significante verbetering die kan worden aangebracht is de mogelijkheid om te pagineren en een Volgende Pagina / Vorige Pagina in de UI op te nemen.




Om het evenemententabblad (pagina) te bouwen, roep ik eerst de Events API aan en analyseer ik de JSON-reactie naar een data frame. Dan sorteer en herordeneer ik het data frame om de timestamp als eerste kolom te plaatsen. Uiteindelijk bouw ik de HTML-tabel door het data frame te doorlopen.




#Bouw de evenementen-API aanroepen params = { "events" : "delivery,injection,bounce,delay,policy_rejection,out_of_band,open,click,generation_failure,generation_rejection,spam_complaint,list_unsubscribe,link_unsubscribe", "delimiter" : ",", "page" : "1", "per_page" : "10" } api_url = BASE_URL + "/events/message" response_API = requests.get(api_url, headers = {"Authorization" : API_KEY}, params=params) response_info = json.loads(response_API.text) new_df = pd.json_normalize(response_info, record_path=['results']) max_rows=10 #Maximaal aantal resultaten dat in de evenemententabel wordt getoond #Plaats timestamp als eerste kolom in de tabel new_df = new_df.reindex(sorted(new_df.columns), axis=1) cols = ['timestamp'] new_df = new_df[cols + [c for c in new_df.columns if c not in cols]] #Toon de nieuwe HTML met de evenemententabel (let op, deze tabel verwijst ook naar table.css) return html.Div([ html.H2("Evenementdetails"), html.Table([ html.Thead( html.Tr([html.Th(col) for col in new_df.columns],className="table_css") ), html.Tbody([ html.Tr([ html.Td(new_df.iloc[i][col],className="table_css") for col in new_df.columns ]) for i in range(min(len(new_df), max_rows)) ]) ]) ])




Dit ziet er zo uit in de UI.










Volgende Stappen

Voor iemand die zijn eigen dashboard of logsysteem wil creëren, is dit een goed begin. Met de aanpasbaarheid hier is de lucht de limiet.




Zoals hierboven besproken, zijn enkele toekomstige verbeteringen die kunnen worden gemaakt:

  • Leverbaarheidsanalyses toevoegen aan het dashboard

  • Meer filters toevoegen aan het dashboard

  • Mogelijke cachingopties zodat de API niet elke keer wordt aangeroepen om de pagina's weer te geven

  • Verbeteringen aan de gebruikersinterface

  • Filtering en paginering toevoegen aan de gebeurtenisdetailpagina




Ik zou geïnteresseerd zijn in het ontvangen van feedback of suggesties voor het uitbreiden van dit project.

~ Zach Samuels, Bird Senior Solutions Engineer

Laten we je in contact brengen met een Bird-expert.
Bekijk de volledige kracht van de Bird in 30 minuten.

Door te verzenden, ga je ermee akkoord dat Bird contact met je mag opnemen over onze producten en diensten.

U kunt zich op elk moment afmelden. Zie Bird's Privacyverklaring voor details over gegevensverwerking.

Nieuwsbrief

Blijf op de hoogte met Bird via wekelijkse updates in je inbox.

Laten we je in contact brengen met een Bird-expert.
Bekijk de volledige kracht van de Bird in 30 minuten.

Door te verzenden, ga je ermee akkoord dat Bird contact met je mag opnemen over onze producten en diensten.

U kunt zich op elk moment afmelden. Zie Bird's Privacyverklaring voor details over gegevensverwerking.

Nieuwsbrief

Blijf op de hoogte met Bird via wekelijkse updates in je inbox.

Laten we je in contact brengen met een Bird-expert.
Bekijk de volledige kracht van de Bird in 30 minuten.

Door te verzenden, ga je ermee akkoord dat Bird contact met je mag opnemen over onze producten en diensten.

U kunt zich op elk moment afmelden. Zie Bird's Privacyverklaring voor details over gegevensverwerking.

R

Bereik

G

Grow

M

Manage

A

Automate

Nieuwsbrief

Blijf op de hoogte met Bird via wekelijkse updates in je inbox.