Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Perjalanan HNG Saya. Peringkat Enam: Memanfaatkan Python untuk Mendedahkan Metrik DORA

Perjalanan HNG Saya. Peringkat Enam: Memanfaatkan Python untuk Mendedahkan Metrik DORA

WBOY
WBOYasal
2024-08-09 12:32:021071semak imbas

My HNG Journey. Stage Six: Leveraging Python to Expose DORA Metrics

pengenalan

Untuk peringkat 6, kami ditugaskan untuk mendedahkan DORA (Penyelidikan DevOps dan, baru-baru ini saya memulakan projek untuk mendedahkan metrik DORA (Penyelidikan dan Penilaian DevOps) menggunakan Python. Pengalaman ini mengajar saya pelajaran berharga tentang amalan DevOps dan selok-belok bekerja dengan API Dalam artikel ini, saya akan membimbing anda melalui proses, menerangkan maksud setiap metrik dan menyerlahkan beberapa perangkap biasa yang perlu diberi perhatian.

Apakah Metrik DORA?
Sebelum kita menyelami kod tersebut, mari kita bincangkan secara ringkas apakah metrik DORA:

  • Kekerapan Deployment: Kekerapan organisasi berjaya melancarkan pengeluaran.
  • Masa Utama untuk Perubahan: Masa yang diperlukan untuk membuat komitmen untuk memasuki pengeluaran.
  • Kadar Kegagalan Tukar: Peratusan penggunaan yang menyebabkan kegagalan dalam pengeluaran.
  • Masa untuk Memulihkan Perkhidmatan: Berapa lama masa yang diambil untuk pulih daripada kegagalan dalam pengeluaran.

Metrik ini membantu pasukan mengukur prestasi penghantaran perisian mereka dan mengenal pasti bidang untuk penambahbaikan.

Bermula
Untuk mula mendedahkan metrik ini, anda memerlukan:

  • Python 3.7 atau lebih tinggi
  • Akaun GitHub dan token akses peribadi
  • Pengetahuan asas API GitHub

Mula-mula, pasang perpustakaan yang diperlukan:

pip install requests prometheus_client

Struktur Kod
Saya menyusun skrip Python saya sebagai kelas yang dipanggil DORAMetrics. Berikut ialah versi mudah permulaannya:

class DORAMetrics:
    def __init__(self, github_token, repo_owner, repo_name):
        self.github_token = github_token
        self.repo_owner = repo_owner
        self.repo_name = repo_name
        self.base_url = f"https://api.github.com/repos/{repo_owner}/{repo_name}"
        self.headers = {
            'Authorization': f'token {github_token}',
            'Accept': 'application/vnd.github.v3+json'
        }

        # Define Prometheus metrics
        self.deployment_frequency = Gauge('dora_deployment_frequency', 'Deployment Frequency (per day)')
        self.lead_time_for_changes = Gauge('dora_lead_time_for_changes', 'Lead Time for Changes (hours)')
        self.change_failure_rate = Gauge('dora_change_failure_rate', 'Change Failure Rate')
        self.time_to_restore_service = Gauge('dora_time_to_restore_service', 'Time to Restore Service (hours)')

Persediaan ini membolehkan kami berinteraksi dengan API GitHub dan mencipta metrik Prometheus untuk setiap metrik DORA.

Mengambil Data daripada GitHub
Salah satu aspek yang paling mencabar ialah mendapatkan semula data yang diperlukan daripada GitHub. Begini cara saya mengambil penempatan:

def get_deployments(self, days=30):
    end_date = datetime.now()
    start_date = end_date - timedelta(days=days)

    url = f"{self.base_url}/deployments"
    params = {'since': start_date.isoformat()}
    deployments = []

    while url:
        response = requests.get(url, headers=self.headers, params=params)
        response.raise_for_status()
        deployments.extend(response.json())
        url = response.links.get('next', {}).get('url')
        params = {} 

    return deployments

Kaedah ini mengendalikan penomboran, memastikan kami mendapat semua penempatan dalam tempoh masa yang ditentukan.

Mengira Metrik DORA
Mari lihat bagaimana saya mengira Kekerapan Penggunaan:

def get_deployment_frequency(self, days=30):
    deployments = self.get_deployments(days)
    return len(deployments) / days

Pengiraan mudah ini memberikan kami purata bilangan penempatan setiap hari sepanjang tempoh yang ditentukan.

Masa Utama untuk Perubahan
Mengira Masa Utama untuk Perubahan adalah lebih rumit. Ia memerlukan komit yang mengaitkan dengan penempatan yang sepadan:

def get_lead_time_for_changes(self, days=30):
    commits = self.get_commits(days)
    deployments = self.get_deployments(days)

    lead_times = []
    for commit in commits:
        commit_date = datetime.strptime(commit['commit']['author']['date'], '%Y-%m-%dT%H:%M:%SZ')
        for deployment in deployments:
            if deployment['sha'] == commit['sha']:
                deployment_date = datetime.strptime(deployment['created_at'], '%Y-%m-%dT%H:%M:%SZ')
                lead_time = (deployment_date - commit_date).total_seconds() / 3600  # in hours
                lead_times.append(lead_time)
                break

    return sum(lead_times) / len(lead_times) if lead_times else 0

Kaedah ini mengira perbezaan masa antara setiap komit dan penggunaan yang sepadan. Adalah penting untuk ambil perhatian bahawa tidak semua komit boleh mengakibatkan penempatan, jadi kami hanya mempertimbangkan yang melakukannya. Keputusan akhir ialah purata masa pendahuluan dalam jam.
Satu cabaran yang saya hadapi di sini ialah memadankan komitmen dengan penempatan. Dalam sesetengah kes, penempatan mungkin termasuk berbilang komit, atau komit mungkin tidak digunakan serta-merta. Saya terpaksa membuat andaian berdasarkan data yang tersedia, yang mungkin memerlukan pelarasan untuk aliran kerja pembangunan yang berbeza.

Tukar Kadar Kegagalan
Menentukan Kadar Kegagalan Perubahan diperlukan untuk menganalisis status setiap penempatan:

def get_change_failure_rate(self, days=30):
    deployments = self.get_deployments(days)

    if not deployments:
        return 0

    total_deployments = len(deployments)
    failed_deployments = 0

    for deployment in deployments:
        status_url = deployment['statuses_url']
        status_response = requests.get(status_url, headers=self.headers)
        status_response.raise_for_status()
        statuses = status_response.json()

        if statuses and statuses[0]['state'] != 'success':
            failed_deployments += 1

    return failed_deployments / total_deployments if total_deployments > 0 else 0

Kaedah ini mengira bilangan kerahan yang gagal dan membahagikannya dengan jumlah kerahan. Cabaran di sini ialah mentakrifkan apa yang menjadi penempatan "gagal". Saya menganggap pelaksanaan gagal jika status terbaharunya bukan "berjaya".
Perlu diingat bahawa pendekatan ini mungkin tidak menangkap semua jenis kegagalan, terutamanya yang berlaku selepas penggunaan yang berjaya. Dalam persekitaran pengeluaran, anda mungkin mahu menyepadukan sistem pemantauan atau pengurusan insiden anda untuk pengesanan kegagalan yang lebih tepat.

Mendedahkan Metrik dengan Prometheus
Untuk menjadikan metrik ini tersedia untuk Prometheus mengikis, saya menggunakan perpustakaan prometheus_client:

from prometheus_client import start_http_server, Gauge

# In the main execution block
start_http_server(8000)

# Update metrics every 5 minutes
while True:
    dora.update_metrics()
    time.sleep(300)

Ini memulakan pelayan pada port 8000 dan mengemas kini metrik setiap 5 minit.

Perangkap Biasa
Semasa projek ini, saya menghadapi beberapa cabaran:

  • Penghadan Kadar API: GitHub mengehadkan bilangan permintaan API yang boleh anda buat. Saya terpaksa melaksanakan penomboran dan mengambil kira kekerapan saya mengemas kini metrik.
  • Kebenaran Token: Pastikan token GitHub anda mempunyai kebenaran yang diperlukan untuk membaca penempatan dan komitmen.
  • Tafsiran Data: Menentukan perkara yang membentuk "pengerahan" atau "kegagalan" boleh menjadi subjektif. Saya terpaksa membuat andaian berdasarkan data yang ada.
  • Masa untuk Memulihkan Perkhidmatan: Metrik ini amat mencabar kerana ia biasanya memerlukan data daripada sistem pengurusan insiden, yang tidak tersedia melalui API GitHub sahaja.

Kesimpulan
Mendedahkan metrik DORA menggunakan Python merupakan pengalaman yang mencerahkan. Ia memperdalam pemahaman saya tentang amalan DevOps dan meningkatkan kemahiran saya dalam bekerja dengan API dan pemprosesan data.
Ingat, metrik ini bertujuan untuk membimbing peningkatan, bukan sebagai kayu untuk mengalahkan pasukan. Gunakannya dengan bijak untuk memupuk budaya peningkatan berterusan dalam proses pembangunan anda.
Terima kasih kerana membaca ❤

Atas ialah kandungan terperinci Perjalanan HNG Saya. Peringkat Enam: Memanfaatkan Python untuk Mendedahkan Metrik DORA. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn