Reach

Grow

Manage

Automate

Reach

Grow

Manage

Automate

Alat Dasbor dengan API Burung

Zachary Samuels

24 Mar 2022

Email

1 min read

Alat Dasbor dengan API Burung

Zachary Samuels

24 Mar 2022

Email

1 min read

Alat Dasbor dengan API Burung

Skrip ini hanya menyentuh permukaan dari apa yang mungkin dilakukan dengan menggunakan Python, Plotly Dash, dan API kami.

Hampir setahun yang lalu, Tom Mairs, direktur kesuksesan pelanggan Bird, menulis alat mailer menggunakan Bird APIs. Dalam postingan ini, saya melanjutkan dari mana dia berhenti. Alatnya memungkinkan pengiriman pekerjaan secara terjadwal, tetapi bagaimana jika kita ingin membuat dashboard dan log acara kita sendiri?

Mungkin saya ingin membuat dashboard khusus untuk kelompok bisnis atau dashboard yang menghadap pelanggan, tetapi tidak memberikan pengguna akses penuh ke antarmuka pengguna Bird. Skrip ini hanya menyentuh permukaan dari apa yang mungkin dilakukan dengan memanfaatkan Python, Plotly Dash, dan API kami. Saat membangun dashboard yang memproses data API dalam volume tinggi, sadari bahwa komponen infrastruktur seperti DNS dapat menjadi hambatan - kami mengalami tantangan penskalaan DNS AWS yang memengaruhi kemampuan pemrosesan data kami. Bagi penggemar alur kerja visual, Anda juga dapat menjelajahi mengintegrasikan Flow Builder dengan Google Cloud Functions dan Vision API untuk menambahkan otomatisasi bertenaga AI ke dalam jalur pemrosesan data Anda.

Ketika saya mulai mencari online, saya ingin menemukan jalur dengan sedikit hambatan. Saya bisa saja membuat semua dashboard dan UI sendiri dalam HTML dan python, namun, setelah beberapa pencarian di Google, saya menemukan Plotly’s Dash, yang mudah diintegrasikan dengan python. Saya memilih Dash dengan 2 alasan: 1) ini adalah open source, dan 2) setelah membaca dokumentasinya tampaknya mudah disesuaikan dengan apa yang saya coba lakukan. Dash adalah perpustakaan open-source yang ideal untuk membangun dan menerapkan aplikasi data dengan antarmuka pengguna yang disesuaikan. Ini membuat pembuatan antarmuka pengguna menjadi sangat sederhana. Pertanyaannya kemudian menjadi, seberapa kompleks saya ingin membuat aplikasi ini? Semakin banyak waktu yang saya habiskan, semakin banyak fitur yang ingin saya tambahkan.

Untuk proyek awal, saya ingin memastikan bahwa saya memiliki dashboard dengan metrik yang dapat disesuaikan dan rentang waktu yang dapat dipilih. Awalnya, saya memulai dengan dashboard di mana Anda hanya dapat memilih satu metrik dari dropdown. Kemudian, saat saya mendapatkan umpan balik dari rekan kerja, saya memperbaiki dashboard sedikit untuk menambahkan multi-pilih dan judul sumbu. Saya juga memutuskan untuk menambahkan tab tambahan untuk log acara. Saya sampai pada titik di mana saya puas dengan apa yang saya miliki sebagai titik awal yang baik bagi siapa saja yang ingin membangun dashboard mereka sendiri. Untuk pengembang yang ingin memasukkan data webhook real-time ke dalam dashboard mereka, lihat panduan kami tentang membangun konsumen webhook dengan Azure Functions. Tentu saja, saya menempatkan proyek ini di Github agar Anda dapat menggandakan atau membuat cabang.

Memulai

Untuk mengakses app ini, Anda perlu memastikan menjalankan python 3.10 atau lebih dan menginstal perpustakaan berikut:

  • requests

  • dash

  • pandas

Kemudian, masukkan API key Anda ke dalam App.py dan jalankan app-nya. Ini akan berjalan pada http://localhost:8050. Untuk informasi lebih lanjut tentang menerapkan ini ke server publik (seperti AWS), silakan lihat sumber daya berikut:

Membuat Halaman Dashboard

Pertama, inisialisasi kerangka data dan dasbor. Tanpa menginisialisasi dasbor, tidak ada dasbor yang akan muncul di UI.

df = pd.DataFrame({

"Count": [0,0],

"Time": [0,0]

})

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

Kemudian, bangun tab pertama. Ini adalah kombinasi dari callback aplikasi (untuk memeriksa tab mana yang sedang digunakan) dan fungsi kondisional untuk memeriksa tab mana yang saat ini terpilih. Kode di bawah ini hanya membangun dasbor kosong dan elemen UI (kami akan membahas tab peristiwa nanti). Elemen dcc adalah Dash Core Components dan HTML Components memungkinkan HTML digunakan di UI.

html.H2('Analytics Dashboard'),

#Dropdown multi-pilih

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="Pilih metrik"),

#Pemilih Tanggal (tanggal maksimum yang diizinkan adalah tanggal hari ini) 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), ),

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

Catatan dengan dash seberapa sederhana membuat UI dasbor dengan dropdown multi-pilih, pencarian. Untuk menonaktifkan pilih-pilih atau pencarian, parameter untuk membuat dropdown dapat dengan mudah dimodifikasi. Saya menemukan bagian paling kompleks dari proyek ini adalah membangun kerangka data nyata dari masukan, serta mendapatkan HTML + CSS berfungsi dengan benar di UI.

Time Series Metrics API memungkinkan 33 metrik individu ditarik berdasarkan rentang tanggal/waktu. Anda dapat memfilter lebih dalam berdasarkan Domain, Kampanye, IP Pools, Sending Domains, Subaccounts, dan menentukan Precision dari data deret waktu. Filter tambahan ini bersama dengan analitik deliverability dapat menjadi peningkatan di masa depan untuk proyek ini (penanganan kesalahan perlu diterapkan untuk klien yang tidak memiliki akses ke analitik deliverability).

Menggunakan dan memanggil Metrics API, saya membangun dasbor dengan parameter yang dipilih pengguna dan jangka waktu yang ditentukan. Dasbor yang diinisialisasi kemudian diperbarui.

#Buat panggilan API menggunakan parameter yang disediakan 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(",") #Buat dasbor baru menggunakan metrik dan tanggal baru dari panggilan API yang diperbarui 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

Berikut ini adalah contoh beberapa metrik yang dipilih dan jangka waktu yang diperluas.


Sparkpost analytics dashboard

Catatan: ada banyak elemen yang terbangun dalam grafik dash secara otomatis (hover, zoom, autoscale).

Pertama, inisialisasi kerangka data dan dasbor. Tanpa menginisialisasi dasbor, tidak ada dasbor yang akan muncul di UI.

df = pd.DataFrame({

"Count": [0,0],

"Time": [0,0]

})

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

Kemudian, bangun tab pertama. Ini adalah kombinasi dari callback aplikasi (untuk memeriksa tab mana yang sedang digunakan) dan fungsi kondisional untuk memeriksa tab mana yang saat ini terpilih. Kode di bawah ini hanya membangun dasbor kosong dan elemen UI (kami akan membahas tab peristiwa nanti). Elemen dcc adalah Dash Core Components dan HTML Components memungkinkan HTML digunakan di UI.

html.H2('Analytics Dashboard'),

#Dropdown multi-pilih

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="Pilih metrik"),

#Pemilih Tanggal (tanggal maksimum yang diizinkan adalah tanggal hari ini) 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), ),

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

Catatan dengan dash seberapa sederhana membuat UI dasbor dengan dropdown multi-pilih, pencarian. Untuk menonaktifkan pilih-pilih atau pencarian, parameter untuk membuat dropdown dapat dengan mudah dimodifikasi. Saya menemukan bagian paling kompleks dari proyek ini adalah membangun kerangka data nyata dari masukan, serta mendapatkan HTML + CSS berfungsi dengan benar di UI.

Time Series Metrics API memungkinkan 33 metrik individu ditarik berdasarkan rentang tanggal/waktu. Anda dapat memfilter lebih dalam berdasarkan Domain, Kampanye, IP Pools, Sending Domains, Subaccounts, dan menentukan Precision dari data deret waktu. Filter tambahan ini bersama dengan analitik deliverability dapat menjadi peningkatan di masa depan untuk proyek ini (penanganan kesalahan perlu diterapkan untuk klien yang tidak memiliki akses ke analitik deliverability).

Menggunakan dan memanggil Metrics API, saya membangun dasbor dengan parameter yang dipilih pengguna dan jangka waktu yang ditentukan. Dasbor yang diinisialisasi kemudian diperbarui.

#Buat panggilan API menggunakan parameter yang disediakan 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(",") #Buat dasbor baru menggunakan metrik dan tanggal baru dari panggilan API yang diperbarui 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

Berikut ini adalah contoh beberapa metrik yang dipilih dan jangka waktu yang diperluas.


Sparkpost analytics dashboard

Catatan: ada banyak elemen yang terbangun dalam grafik dash secara otomatis (hover, zoom, autoscale).

Pertama, inisialisasi kerangka data dan dasbor. Tanpa menginisialisasi dasbor, tidak ada dasbor yang akan muncul di UI.

df = pd.DataFrame({

"Count": [0,0],

"Time": [0,0]

})

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

Kemudian, bangun tab pertama. Ini adalah kombinasi dari callback aplikasi (untuk memeriksa tab mana yang sedang digunakan) dan fungsi kondisional untuk memeriksa tab mana yang saat ini terpilih. Kode di bawah ini hanya membangun dasbor kosong dan elemen UI (kami akan membahas tab peristiwa nanti). Elemen dcc adalah Dash Core Components dan HTML Components memungkinkan HTML digunakan di UI.

html.H2('Analytics Dashboard'),

#Dropdown multi-pilih

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="Pilih metrik"),

#Pemilih Tanggal (tanggal maksimum yang diizinkan adalah tanggal hari ini) 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), ),

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

Catatan dengan dash seberapa sederhana membuat UI dasbor dengan dropdown multi-pilih, pencarian. Untuk menonaktifkan pilih-pilih atau pencarian, parameter untuk membuat dropdown dapat dengan mudah dimodifikasi. Saya menemukan bagian paling kompleks dari proyek ini adalah membangun kerangka data nyata dari masukan, serta mendapatkan HTML + CSS berfungsi dengan benar di UI.

Time Series Metrics API memungkinkan 33 metrik individu ditarik berdasarkan rentang tanggal/waktu. Anda dapat memfilter lebih dalam berdasarkan Domain, Kampanye, IP Pools, Sending Domains, Subaccounts, dan menentukan Precision dari data deret waktu. Filter tambahan ini bersama dengan analitik deliverability dapat menjadi peningkatan di masa depan untuk proyek ini (penanganan kesalahan perlu diterapkan untuk klien yang tidak memiliki akses ke analitik deliverability).

Menggunakan dan memanggil Metrics API, saya membangun dasbor dengan parameter yang dipilih pengguna dan jangka waktu yang ditentukan. Dasbor yang diinisialisasi kemudian diperbarui.

#Buat panggilan API menggunakan parameter yang disediakan 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(",") #Buat dasbor baru menggunakan metrik dan tanggal baru dari panggilan API yang diperbarui 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

Berikut ini adalah contoh beberapa metrik yang dipilih dan jangka waktu yang diperluas.


Sparkpost analytics dashboard

Catatan: ada banyak elemen yang terbangun dalam grafik dash secara otomatis (hover, zoom, autoscale).

Membuat Halaman Detil Event

Halaman detail acara sedikit lebih sulit karena saya tidak tahu cara terbaik untuk menyajikan semua metrik acara dalam cara yang mudah dibaca. Saya mempertimbangkan untuk menambahkan parameter penyaringan ke halaman ini, namun, saya memutuskan bahwa itu akan menambah waktu yang signifikan untuk proyek ini karena tabel tersebut kemudian harus menjadi dinamis (bersama dengan menambahkan parameter, callback, dll.). Saya memutuskan untuk menampilkan semua acara dan menempatkan cap waktu pertama (karena tanpa menempatkan cap waktu pertama, grafik tidak mudah dibaca). Awalnya, saya menemukan bahwa dengan hanya HTML mentah, tabelnya sangat sulit di mata. Tidak ada batas dan tidak ada perbedaan warna untuk header versus baris. Untuk membuat tabel lebih mudah dibaca, saya bisa menggunakan CSS di dalam Dash.

Ide untuk detail acara hampir sama dengan dasbor, kecuali kali ini, saya memanggil Events API dan membawa semua acara. Perhatikan bahwa detail acara hanya menunjukkan 10 acara terbaru (menggunakan parameter max_rows dan penyaringan API). Ini dapat ditingkatkan, namun, saya memutuskan untuk menampilkan 10 acara terbaru karena semakin banyak acara yang ditampilkan, semakin lama waktu yang dibutuhkan untuk panggilan API. Satu perbaikan signifikan yang dapat dilakukan adalah kemampuan untuk membagi halaman dan menyertakan Halaman Berikutnya / Halaman Sebelumnya dalam antarmuka pengguna.

Untuk membangun tab acara (halaman), pertama, saya memanggil Events API dan mengurai respons JSON menjadi kerangka data. Kemudian saya menyortir dan menyusun ulang kerangka data untuk menempatkan cap waktu sebagai kolom pertama. Terakhir, saya membangun tabel HTML dengan mengiterasi melalui kerangka data.

#Bangun dan panggil parameter API acara 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 #Jumlah maksimal hasil ditampilkan dalam tabel acara #Tempatkan cap waktu sebagai kolom pertama dalam 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]] #Tampilkan HTML baru dengan tabel acara (catatan, tabel ini juga merujuk pada table.css) return html.Div([ html.H2("Detail Acara"), 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)) ]) ]) ])

Yang terlihat seperti ini di antarmuka pengguna.

Sparkpost event details

Langkah Selanjutnya

Bagi seseorang yang ingin membuat dashboard atau log acara mereka sendiri, ini adalah awal yang baik. Dengan kustomisasi di sini, langit adalah batasnya.

Seperti yang dibahas di atas, beberapa peningkatan di masa depan yang bisa dilakukan adalah:

  • Menambahkan analitik pengiriman ke dashboard

  • Menambahkan lebih banyak filter ke dashboard

  • Opsi caching yang memungkinkan sehingga API tidak dipanggil setiap kali untuk menampilkan halaman

  • Peningkatan UI

  • Menambahkan penyaringan dan paginasi ke halaman detail acara

Saya akan tertarik mendengar umpan balik atau saran untuk mengembangkan proyek ini.

~ Zach Samuels, Bird Senior Solutions Engineer

Mari hubungkan Anda dengan pakar Bird.
Lihat kekuatan penuh dari Bird dalam 30 menit.

Dengan mengirimkan, Anda setuju Bird dapat menghubungi Anda tentang produk dan layanan kami.

Anda dapat berhenti berlangganan kapan saja. Lihat Pernyataan Privasi Bird untuk detail tentang pemrosesan data.

Perusahaan

Newsletter

Tetap terinformasi dengan Bird melalui pembaruan mingguan ke kotak masuk Anda.

Mari hubungkan Anda dengan pakar Bird.
Lihat kekuatan penuh dari Bird dalam 30 menit.

Dengan mengirimkan, Anda setuju Bird dapat menghubungi Anda tentang produk dan layanan kami.

Anda dapat berhenti berlangganan kapan saja. Lihat Pernyataan Privasi Bird untuk detail tentang pemrosesan data.

Perusahaan

Newsletter

Tetap terinformasi dengan Bird melalui pembaruan mingguan ke kotak masuk Anda.

Mari hubungkan Anda dengan pakar Bird.
Lihat kekuatan penuh dari Bird dalam 30 menit.

Dengan mengirimkan, Anda setuju Bird dapat menghubungi Anda tentang produk dan layanan kami.

Anda dapat berhenti berlangganan kapan saja. Lihat Pernyataan Privasi Bird untuk detail tentang pemrosesan data.

R

Reach

G

Grow

M

Manage

A

Automate

Perusahaan

Newsletter

Tetap terinformasi dengan Bird melalui pembaruan mingguan ke kotak masuk Anda.