Zasięg

Grow

Manage

Automate

Zasięg

Grow

Manage

Automate

Narzędzie do tworzenia pulpitów z interfejsami API ptaków

Zachary Samuels

24 mar 2022

Email

1 min read

Narzędzie do tworzenia pulpitów z interfejsami API ptaków

Zachary Samuels

24 mar 2022

Email

1 min read

Narzędzie do tworzenia pulpitów z interfejsami API ptaków

Ten skrypt jedynie dotyka powierzchni tego, co jest możliwe przy użyciu Pythona, Plotly Dash i naszych interfejsów API.

Prawie rok temu, Tom Mairs, dyrektor ds. sukcesu klienta w Bird, napisał narzędzie do mailerów wykorzystujące Bird APIs. W tym poście kontynuuję tam, gdzie on skończył. Jego narzędzie pozwala na czasową transmisję zadań, ale co jeśli chcemy stworzyć własne pulpity i dzienniki zdarzeń?

Może chcę stworzyć konkretny pulpit dla grupy biznesowej lub pulpit skierowany do klienta, ale nie zapewniać użytkownikom pełnego dostępu do interfejsu Bird UI. Ten skrypt zaledwie dotyka powierzchni tego, co jest możliwe, wykorzystując Python, Plotly Dash oraz nasze API. Podczas budowania pulpitów, które przetwarzają dane z API o dużym wolumenie, pamiętaj, że elementy infrastruktury, takie jak DNS, mogą stać się wąskimi gardłami - doświadczyliśmy problemów skalowania DNS w AWS, które wpłynęły na nasze możliwości przetwarzania danych. Dla entuzjastów wizualnych przepływów pracy, możesz również zbadać integrację Flow Builder z Google Cloud Functions i Vision API w celu dodania automatyzacji zasilanej sztuczną inteligencją do swoich rurociągów przetwarzania danych.

Kiedy zacząłem swoje poszukiwania online, chciałem znaleźć drogę najmniejszego oporu. Mógłbym stworzyć wszystkie pulpity i UI sam w HTML i Pythonie, jednak po pewnym googlowaniu, natrafiłem na Plotly’s Dash, który łatwo integruje się z Pythonem. Wybrałem Dash z 2 powodów: 1) jest open source, i 2) po przeczytaniu dokumentacji wydawało się, że można go łatwo dostosować do tego, co chciałem zrobić. Dash to biblioteka open source, która jest idealna do budowy i wdrażania aplikacji danych z dostosowanym interfejsem użytkownika. To sprawiło, że tworzenie UI było niezwykle proste. Pytanie zatem brzmiało, jak bardzo złożoną chciałem zrobić tę aplikację? Im więcej czasu spędzałem, tym więcej funkcji chciałem dodać.

Dla początkowego projektu chciałem upewnić się, że mam pulpit z dostosowywanymi metrykami i wybieranym czasookresem. Początkowo zacząłem od pulpitu, na którym można było wybrać tylko jedną metrykę z listy rozwijanej. Potem, po otrzymaniu opinii od kolegów, udoskonaliłem pulpit nieco, aby dodać wybór wielokrotny i tytuły osi. Zdecydowałem się również dodać dodatkową kartę do dziennika zdarzeń. Doszedłem do punktu, w którym byłem zadowolony z tego, co miałem jako dobry punkt wyjścia dla każdego, kto chce stworzyć własne pulpit. Dla deweloperów, którzy chcą wprowadzać dane w czasie rzeczywistym do swoich pulpitów, sprawdź nasz przewodnik na temat budowania konsumentów webhook z Azure Functions. Oczywiście umieściłem projekt na Github do klonowania lub branchingu.

Pierwsze kroki

Aby uzyskać dostęp do tej app, musisz upewnić się, że masz zainstalowaną wersję python 3.10 lub wyższą oraz zainstalować następujące biblioteki:

  • requests

  • dash

  • pandas

Następnie wprowadź swój klucz API do App.py i uruchom aplikację. Uruchomi się na http://localhost:8050. Aby uzyskać dalsze informacje na temat wdrażania tego na serwerze dostępnym publicznie (takim jak AWS), zobacz następujące zasoby:

Tworzenie strony Dashboard

Najpierw zainicjuj data frame i pulpit nawigacyjny. Bez inicjalizacji pulpitu nawigacyjnego żaden pulpit nawigacyjny nie pojawi się w interfejsie użytkownika.

df = pd.DataFrame({

"Count": [0,0],

"Time": [0,0]

})

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

Następnie zbuduj pierwszą kartę. Jest to połączenie wywołania zwrotnego aplikacji (sprawdzającego, która karta jest używana) wraz z funkcją warunkową sprawdzającą, która karta jest aktualnie wybrana. Kod poniżej buduje jedynie pusty pulpit nawigacyjny i elementy interfejsu użytkownika (do zakładki zdarzeń przejdziemy później). Elementy dcc to Dash Core Components i HTML Components, które umożliwiają łatwe użycie HTML w interfejsie użytkownika.

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="Wybierz metryki"),

#Date selector (max date allowed is set to today's date) 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), ),

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

Zobacz, jak proste jest tworzenie interfejsu użytkownika pulpitu nawigacyjnego z wielokrotnym wyborem i przeszukiwanym dropdownem w Dash. Aby wyłączyć multi-select lub wyszukiwanie, parametry tworzenia dropdown można łatwo zmodyfikować. Odkryłem, że najtrudniejszą częścią tego projektu było zbudowanie rzeczywistego data frame z danych wejściowych oraz prawidłowe działanie HTML + CSS w interfejsie użytkownika.

Time Series Metrics API pozwala na pobranie 33 indywidualnych metryk na podstawie zakresu dat/czasu. Możesz filtrować głębiej według Domen, Kampanii, Puli IP, Domen Wysyłających, Podkont i określać Precyzję danych szeregu czasowego. Te dodatkowe filtry wraz z analizą dostarczalności mogą być przyszłym ulepszeniem tego projektu (należałoby wdrożyć wykrywanie błędów dla klientów, którzy nie mają dostępu do analityki dostarczalności).

Wykorzystując i wywołując Metrics API, tworzę pulpit nawigacyjny z wybranymi parametrami użytkownika i określonym przedziałem czasowym. Zainicjowany pulpit nawigacyjny jest następnie aktualizowany.

#Build the API call utilizing the parameters provided 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(",") #Build out a new dashboard utilizing the new metrics and dates from the updated API call 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

Poniżej znajduje się przykład wielu wybranych metryk i rozszerzonego zakresu czasowego.


Sparkpost analytics dashboard

Uwaga: w wykresie dash wiele elementów jest wbudowanych automatycznie (hover, zoom, autoscale).

Najpierw zainicjuj data frame i pulpit nawigacyjny. Bez inicjalizacji pulpitu nawigacyjnego żaden pulpit nawigacyjny nie pojawi się w interfejsie użytkownika.

df = pd.DataFrame({

"Count": [0,0],

"Time": [0,0]

})

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

Następnie zbuduj pierwszą kartę. Jest to połączenie wywołania zwrotnego aplikacji (sprawdzającego, która karta jest używana) wraz z funkcją warunkową sprawdzającą, która karta jest aktualnie wybrana. Kod poniżej buduje jedynie pusty pulpit nawigacyjny i elementy interfejsu użytkownika (do zakładki zdarzeń przejdziemy później). Elementy dcc to Dash Core Components i HTML Components, które umożliwiają łatwe użycie HTML w interfejsie użytkownika.

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="Wybierz metryki"),

#Date selector (max date allowed is set to today's date) 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), ),

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

Zobacz, jak proste jest tworzenie interfejsu użytkownika pulpitu nawigacyjnego z wielokrotnym wyborem i przeszukiwanym dropdownem w Dash. Aby wyłączyć multi-select lub wyszukiwanie, parametry tworzenia dropdown można łatwo zmodyfikować. Odkryłem, że najtrudniejszą częścią tego projektu było zbudowanie rzeczywistego data frame z danych wejściowych oraz prawidłowe działanie HTML + CSS w interfejsie użytkownika.

Time Series Metrics API pozwala na pobranie 33 indywidualnych metryk na podstawie zakresu dat/czasu. Możesz filtrować głębiej według Domen, Kampanii, Puli IP, Domen Wysyłających, Podkont i określać Precyzję danych szeregu czasowego. Te dodatkowe filtry wraz z analizą dostarczalności mogą być przyszłym ulepszeniem tego projektu (należałoby wdrożyć wykrywanie błędów dla klientów, którzy nie mają dostępu do analityki dostarczalności).

Wykorzystując i wywołując Metrics API, tworzę pulpit nawigacyjny z wybranymi parametrami użytkownika i określonym przedziałem czasowym. Zainicjowany pulpit nawigacyjny jest następnie aktualizowany.

#Build the API call utilizing the parameters provided 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(",") #Build out a new dashboard utilizing the new metrics and dates from the updated API call 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

Poniżej znajduje się przykład wielu wybranych metryk i rozszerzonego zakresu czasowego.


Sparkpost analytics dashboard

Uwaga: w wykresie dash wiele elementów jest wbudowanych automatycznie (hover, zoom, autoscale).

Najpierw zainicjuj data frame i pulpit nawigacyjny. Bez inicjalizacji pulpitu nawigacyjnego żaden pulpit nawigacyjny nie pojawi się w interfejsie użytkownika.

df = pd.DataFrame({

"Count": [0,0],

"Time": [0,0]

})

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

Następnie zbuduj pierwszą kartę. Jest to połączenie wywołania zwrotnego aplikacji (sprawdzającego, która karta jest używana) wraz z funkcją warunkową sprawdzającą, która karta jest aktualnie wybrana. Kod poniżej buduje jedynie pusty pulpit nawigacyjny i elementy interfejsu użytkownika (do zakładki zdarzeń przejdziemy później). Elementy dcc to Dash Core Components i HTML Components, które umożliwiają łatwe użycie HTML w interfejsie użytkownika.

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="Wybierz metryki"),

#Date selector (max date allowed is set to today's date) 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), ),

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

Zobacz, jak proste jest tworzenie interfejsu użytkownika pulpitu nawigacyjnego z wielokrotnym wyborem i przeszukiwanym dropdownem w Dash. Aby wyłączyć multi-select lub wyszukiwanie, parametry tworzenia dropdown można łatwo zmodyfikować. Odkryłem, że najtrudniejszą częścią tego projektu było zbudowanie rzeczywistego data frame z danych wejściowych oraz prawidłowe działanie HTML + CSS w interfejsie użytkownika.

Time Series Metrics API pozwala na pobranie 33 indywidualnych metryk na podstawie zakresu dat/czasu. Możesz filtrować głębiej według Domen, Kampanii, Puli IP, Domen Wysyłających, Podkont i określać Precyzję danych szeregu czasowego. Te dodatkowe filtry wraz z analizą dostarczalności mogą być przyszłym ulepszeniem tego projektu (należałoby wdrożyć wykrywanie błędów dla klientów, którzy nie mają dostępu do analityki dostarczalności).

Wykorzystując i wywołując Metrics API, tworzę pulpit nawigacyjny z wybranymi parametrami użytkownika i określonym przedziałem czasowym. Zainicjowany pulpit nawigacyjny jest następnie aktualizowany.

#Build the API call utilizing the parameters provided 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(",") #Build out a new dashboard utilizing the new metrics and dates from the updated API call 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

Poniżej znajduje się przykład wielu wybranych metryk i rozszerzonego zakresu czasowego.


Sparkpost analytics dashboard

Uwaga: w wykresie dash wiele elementów jest wbudowanych automatycznie (hover, zoom, autoscale).

Tworzenie strony Event Details

Strona szczegółów wydarzenia była nieco trudniejsza, ponieważ nie wiedziałem, jak najlepiej przedstawić wszystkie metryki wydarzeń w sposób łatwy do odczytania. Rozważałem dodanie parametrów filtrowania do tej strony, jednak zdecydowałem, że to wydłużyłoby znacząco czas tego projektu, ponieważ tabela musiałaby być wtedy dynamiczna (wraz z dodaniem parametrów, wywołań zwrotnych, itp.). Ostatecznie zdecydowałem się pokazać wszystkie wydarzenia z umieszczeniem znacznika czasu na początku (ponieważ bez umieszczenia znacznika czasu na początku, wykres był trudny do odczytania). Początkowo odkryłem, że sam surowy HTML sprawiał, że tabela była niezmiernie trudna dla oczu. Nie było granic ani różnic kolorów między nagłówkiem a wierszami. Aby tabela była łatwiejsza do odczytania, udało mi się użyć CSS w Dash.

Pomysł na szczegóły wydarzenia jest prawie taki sam jak w dashboardzie, z tym wyjątkiem, że tym razem wywołuję Events API i wprowadzam wszystkie wydarzenia. Uwaga: szczegóły wydarzenia pokazują tylko 10 najnowszych wydarzeń (wykorzystując parametr max_rows i filtrowanie API). To można zwiększyć, jednak zdecydowałem się pokazać tylko 10 najnowszych wydarzeń, ponieważ im więcej jest pokazanych wydarzeń, tym dłużej trwa wywołanie API. Jednym z istotnych ulepszeń, które można by wprowadzić, byłaby możliwość paginacji i uwzględnienie Przyciski „Następna strona”/„Poprzednia strona” w interfejsie użytkownika.

Aby zbudować kartę wydarzeń (stronę), najpierw wywołuję Events API i parsuję odpowiedź JSON do ramki danych. Następnie sortuję i zmieniam kolejność ramki danych, aby umieścić znacznik czasu jako pierwszą kolumnę. Wreszcie buduję tabelę HTML, iterując przez ramkę danych.

# Zbuduj i wywołaj Events API 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 # Maksymalna liczba wyników do pokazania w tabeli wydarzeń # Umieść znacznik czasu jako pierwszą kolumnę w tabeli 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]] # Pokaż nowy HTML z tabelą wydarzeń (uwaga, ta tabela także odnosi się do table.css) return html.Div([ html.H2("Szczegóły wydarzenia"), 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)) ]) ]) ])

Wygląda to tak w interfejsie użytkownika.

Sparkpost event details

Następne Kroki

Dla kogoś, kto chce stworzyć własny pulpit nawigacyjny lub dziennik zdarzeń, to dobry początek. Dzięki personalizacji tutaj, niebo jest limitem.

Jak wspomniano powyżej, niektóre przyszłe ulepszenia, które można wprowadzić, to:

  • Dodanie analityki dostarczalności do pulpitu nawigacyjnego

  • Dodanie większej liczby filtrów do pulpitu nawigacyjnego

  • Możliwe opcje buforowania, aby API nie było wywoływane za każdym razem w celu wyświetlenia stron

  • Ulepszenia UI

  • Dodanie filtrowania i paginacji do strony szczegółów zdarzeń

Jestem zainteresowany usłyszeniem jakichkolwiek opinii lub sugestii dotyczących rozwoju tego projektu.

~ Zach Samuels, Bird Senior Solutions Engineer

Połączmy Cię z ekspertem Bird.
Zobacz pełną moc Bird w 30 minut.

Przesyłając, zgadzasz się, że Bird może kontaktować się z Tobą w sprawie naszych produktów i usług.

Możesz zrezygnować z subskrypcji w dowolnym momencie. Zobacz Privacy Statement firmy Bird, aby uzyskać szczegóły dotyczące przetwarzania danych.

Company

Biuletyn

Bądź na bieżąco z Bird dzięki cotygodniowym aktualizacjom do Twojej skrzynki odbiorczej.

Połączmy Cię z ekspertem Bird.
Zobacz pełną moc Bird w 30 minut.

Przesyłając, zgadzasz się, że Bird może kontaktować się z Tobą w sprawie naszych produktów i usług.

Możesz zrezygnować z subskrypcji w dowolnym momencie. Zobacz Privacy Statement firmy Bird, aby uzyskać szczegóły dotyczące przetwarzania danych.

Company

Biuletyn

Bądź na bieżąco z Bird dzięki cotygodniowym aktualizacjom do Twojej skrzynki odbiorczej.

Połączmy Cię z ekspertem Bird.
Zobacz pełną moc Bird w 30 minut.

Przesyłając, zgadzasz się, że Bird może kontaktować się z Tobą w sprawie naszych produktów i usług.

Możesz zrezygnować z subskrypcji w dowolnym momencie. Zobacz Privacy Statement firmy Bird, aby uzyskać szczegóły dotyczące przetwarzania danych.

R

Reach

G

Grow

M

Manage

A

Automate

Company

Biuletyn

Bądź na bieżąco z Bird dzięki cotygodniowym aktualizacjom do Twojej skrzynki odbiorczej.