Oktatóanyag: Szén-dioxid-optimalizálási adatok exportálása Python-szkripttel

Ez az oktatóanyag bemutatja, hogyan exportálhat Azure Carbon-optimalizálási kibocsátási adatokat JSON-kimenetként Python-szkripttel. A Python-szkript Carbon Service REST API-hálózati kéréseket futtat az Azure-erőforrások kibocsátási adatainak lekéréséhez. A szkript leegyszerűsíti az API lekérdezésének és a válasz kezelésének folyamatát. Futtassa a szkriptet a JSON-fájlok létrehozásához, majd használja őket részletes elemzéshez és jelentéskészítéshez.

Ez az oktatóanyag a szén-dioxid-optimalizálás kibocsátási adatainak a helyi Windows-számítógépen való exportálásához szükséges lépéseket ismerteti.

Az oktatóanyag elvégzéséhez több lépés is szükséges:

  • Az előfeltételek áttekintése és a hiányzó összetevők telepítése
  • A Python letöltése és telepítése
  • A szükséges Python-csomagok telepítése
  • A Python-példaszkript vizsgálata és frissítése
  • A Python-szkript futtatása
  • A JSON kimeneti fájljainak áttekintése

Előfeltételek

A Python-szkript használata előtt győződjön meg arról, hogy rendelkezik a következővel:

  • Megfelelő Azure-engedélyek (Carbon Optimization Readervagy Subscription OwnerSubscription Contributor szerepkör)
  • Azon érvényes Azure-előfizetési azonosítók listája, amelyekhez kibocsátási adatokat szeretne lekérni
  • A szén-dioxid-kibocsátási hatókörök ismerete (Hatókör1, Hatókör2, Hatókör3)
  • Legalább egy teljes hónapra vonatkozó, exportálásra rendelkezésre álló kibocsátási adatok (az adatok az előző hónapra vonatkozóan az aktuális hónap 19. napjára érhetők el)

Az Azure PowerShell telepítése

Ha nincs telepítve az Azure PowerShell a helyi Windows-számítógépen, kövesse az alábbi lépéseket:

Indítsa el a Windows PowerShell 5.1-et rendszergazdaként, és futtassa a következő parancsot a PowerShellGet frissítéséhez a PowerShell-gyűjtemény használatával:

Install-Module -Name PowerShellGet -Force

Állítsa a PowerShell végrehajtási szabályzatát távoli aláírt vagy kevésbé korlátozó értékre:

  • Ellenőrizze a PowerShell végrehajtási szabályzatát:
    Get-ExecutionPolicy -List
    
  • A PowerShell végrehajtási házirendjének beállítása távoli aláírásra:
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
    
    

Az Az PowerShell-modul telepítéséhez használja a Install-Module parancsmagot:

Install-Module -Name Az -Repository PSGallery -Force

Előfordulhat, hogy a telepítés befejezése után újra kell indítania a PowerShellt.

Az Azure PowerShell telepítésével kapcsolatos további információkért, beleértve a különböző platformokon történő telepítést, olvassa el az Azure PowerShell telepítését ismertető témakört.

Bejelentkezés az Azure-ba

Az Azure-erőforrások az Az PowerShell-modullal való kezelésének megkezdéséhez indítsa el a PowerShell-munkamenetet, és futtassa Connect-AzAccount a bejelentkezést az Azure-ba:

Connect-AzAccount

Az Azure-fiók bejelentkezési hitelesítő adataival jelentkezzen be a megnyíló böngészőablakba.

Ezt a lépést minden új PowerShell-munkamenethez meg kell ismételnie.

Az Azure CLI telepítése

Ha nincs telepítve az Azure CLI a helyi Windows-számítógépen, kövesse az alábbi lépéseket:

  1. Tekintse át az Azure CLI Windows rendszeren való telepítésével kapcsolatos információkat.
  2. Válasszon ki egy telepítési módszert, majd futtassa a helyi számítógéphez leginkább illő telepítőt.
  3. A telepítés befejezése után nyisson meg egy új parancssort vagy PowerShell-ablakot (rendszergazdai jogosultságokkal) jelentkezzen be az Azure-fiókjába:
    az login
    

A Python letöltése és telepítése

Ha nincs telepítve a Python a helyi Windows-számítógépen, kövesse az alábbi lépéseket:

  1. Tekintse át a Python-letöltések adatait.
  2. Válassza ki, töltse le és futtassa a telepítőt a helyi számítógéphez leginkább illő Python-kiadáshoz.

A szükséges Python-csomagok telepítése

A parancssorban vagy a PowerShell-ablakban (rendszergazdai jogosultságokkal) futtassa a következő parancsot a szükséges Python-csomagok telepítéséhez:

pip install azure-identity azure-mgmt-carbonoptimization

A Python-példaszkript vizsgálata és frissítése

  1. Másolja ki a következő Python-példaszkriptet, és mentse helyileg. Mentse például úgy, hogy export_carbon_emission_data.py-ként menti
  2. Tekintse át a szkriptet, és cserélje le az összes példányt Subscription_ID_XXX a tényleges Azure-előfizetési azonosítókra. Szükség szerint vegyen fel vagy távolítson el példa-előfizetéseket. Legfeljebb 100 előfizetési azonosító támogatott.
  3. Mentse a fájlt.

Alapértelmezés szerint a szkript csak az utolsó teljes hónap adatait adja ki. Egyes jelentések egyéni időtartományára (teljes hónapra) frissítheti a szkriptet. Tekintse át a szkript megjegyzéseit, és ellenőrizze, hogy egy jelentés támogatja-e az egyéni tartományt. Keresse meg a következő eseteket:

    date_range = DateRange(
        start=date.fromisoformat(available_date_range.start_date),
        end=date.fromisoformat(available_date_range.end_date),
    )

Ezután frissítsen az alábbi példához hasonlóan:

    date_range = DateRange(
        start=date.fromisoformat("YYYY-MM-DD"),
        end=date.fromisoformat("YYYY-MM-DD"),
    )
"""
Azure Carbon Optimization

This script queries Azure Carbon Optimization reports by using the Python azure-mgmt-carbonoptimization(https://pypi.org/project/azure-mgmt-carbonoptimization/) SDK.

"""

import os
import json
import logging
import time
from datetime import datetime, timezone, date
from typing import List, Dict, Any, Optional
from pathlib import Path

from azure.identity import DefaultAzureCredential
from azure.mgmt.carbonoptimization import CarbonOptimizationMgmtClient
from azure.mgmt.carbonoptimization.models import CarbonEmissionDataAvailableDateRange, CategoryTypeEnum, SortDirectionEnum,\
    OrderByColumnEnum, ReportTypeEnum, ResponseDataTypeEnum, CarbonEmissionItemDetailData, DateRange, EmissionScopeEnum,\
    CarbonEmissionData, ResourceCarbonEmissionItemDetailData, ResourceGroupCarbonEmissionItemDetailData, \
    ItemDetailsQueryFilter, MonthlySummaryReportQueryFilter, TopItemsSummaryReportQueryFilter, \
    TopItemsMonthlySummaryReportQueryFilter, OverallSummaryReportQueryFilter, CarbonEmissionDataListResult

from azure.core.exceptions import (
    ClientAuthenticationError, 
    HttpResponseError, 
    ResourceNotFoundError
)


# Initialize Azure CarbonOptimization SDK clients
credential = DefaultAzureCredential()
client = CarbonOptimizationMgmtClient(credential=credential)
carbon_service = client.carbon_service


def query_item_detail_data_by_category_type(category_type: CategoryTypeEnum) -> None :
    # get latest available carbon data date range
    available_date_range = carbon_service.query_carbon_emission_data_available_date_range()

    # Get latest month

    date_range = DateRange(
        start=date.fromisoformat(available_date_range.end_date),
        end=date.fromisoformat(available_date_range.end_date),
    )

    # Build query filter for item detail report
    item_detail_query_filter = ItemDetailsQueryFilter(date_range=date_range,
                                                      subscription_list=[
                                                          "Subscription_ID_001", "Subscription_ID_002", "Subscription_ID_100"
                                                      ], # suggest to put 100 subscription id 
                                                      carbon_scope_list=[EmissionScopeEnum.SCOPE1, EmissionScopeEnum.SCOPE2, EmissionScopeEnum.SCOPE3],
                                                      category_type=category_type,
                                                      order_by=OrderByColumnEnum.ITEM_NAME,
                                                      sort_direction=SortDirectionEnum.DESC,
                                                      page_size=50  # suggest with 2000 as pageSize
                                                      )

    with open(f"carbon_emission_{str(category_type.value).lower()}_item_detail_report.json", "a", encoding="utf-8") as f:
        while True:
            result_list = carbon_service.query_carbon_emission_reports(item_detail_query_filter)

            for item in result_list.value:
                f.write(json.dumps(item.as_dict(), ensure_ascii=False))
                f.write("\n")

            if not result_list.skip_token:
            # no more pages, break
                print("all data retrieved")
                break
        
            # set the continuation token for the next page
            item_detail_query_filter.skip_token = result_list.skip_token
            print("continue to get next page data")


def query_top_items_monthly_report_by_category_type(category_type: CategoryTypeEnum) -> None :
    # get latest available carbon data date range
    available_date_range = carbon_service.query_carbon_emission_data_available_date_range()

    date_range = DateRange(
        start=date.fromisoformat(available_date_range.start_date),
        end=date.fromisoformat(available_date_range.end_date),
    )

    # Build query filter for top items monthly report
    item_detail_query_filter = TopItemsMonthlySummaryReportQueryFilter(
        date_range=date_range,
        subscription_list=[
            "Subscription_ID_001", "Subscription_ID_002", "Subscription_ID_100"
        ], # suggest to put 100 subscription id 
        carbon_scope_list=[EmissionScopeEnum.SCOPE1, EmissionScopeEnum.SCOPE2, EmissionScopeEnum.SCOPE3],
        category_type=category_type,
        top_items=5
    )

    with open(f"carbon_emission_{str(category_type.value).lower()}_top_items_monthly_report.json", "a", encoding="utf-8") as f:
        result_list = carbon_service.query_carbon_emission_reports(item_detail_query_filter)

        for item in result_list.value:
            f.write(json.dumps(item.as_dict(), ensure_ascii=False))
            f.write("\n")

def query_top_items_report_by_category_type(category_type: CategoryTypeEnum) -> None :
    # get latest available carbon data date range
    available_date_range = carbon_service.query_carbon_emission_data_available_date_range()

    # only set one month for Top Items Report
    date_range = DateRange(
        start=date.fromisoformat(available_date_range.end_date),
        end=date.fromisoformat(available_date_range.end_date),
    )

    # Build query filter for top items report
    item_detail_query_filter = TopItemsSummaryReportQueryFilter(
        date_range=date_range,
        subscription_list=[
            "Subscription_ID_001", "Subscription_ID_002", "Subscription_ID_100"
        ], # suggest to put 100 subscription id 
        carbon_scope_list=[EmissionScopeEnum.SCOPE1, EmissionScopeEnum.SCOPE2, EmissionScopeEnum.SCOPE3],
        category_type=category_type,
        top_items=5
    )

    with open(f"carbon_emission_{str(category_type.value).lower()}_top_items_report.json", "a", encoding="utf-8") as f:
        result_list = carbon_service.query_carbon_emission_reports(item_detail_query_filter)

        for item in result_list.value:
            f.write(json.dumps(item.as_dict(), ensure_ascii=False))
            f.write("\n")

def query_overall_summary_report_by_category_type() -> None :
    # get latest available carbon data date range
    available_date_range = carbon_service.query_carbon_emission_data_available_date_range()

    date_range = DateRange(
        start=date.fromisoformat(available_date_range.start_date),
        end=date.fromisoformat(available_date_range.end_date),
    )

    # Build query filter for overall summary report
    item_detail_query_filter = OverallSummaryReportQueryFilter(
        date_range=date_range,
        subscription_list=[
            "Subscription_ID_001", "Subscription_ID_002", "Subscription_ID_100"
        ], # suggest to put 100 subscription id 
        carbon_scope_list=[EmissionScopeEnum.SCOPE1, EmissionScopeEnum.SCOPE2, EmissionScopeEnum.SCOPE3]
    )

    with open(f"carbon_emission_overall_summary_report.json", "a", encoding="utf-8") as f:
        result_list = carbon_service.query_carbon_emission_reports(item_detail_query_filter)

        for item in result_list.value:
            f.write(json.dumps(item.as_dict(), ensure_ascii=False))
            f.write("\n")

def query_monthly_overall_summary_report_by_category_type() -> None :
    # get latest available carbon data date range
    available_date_range = carbon_service.query_carbon_emission_data_available_date_range()

    date_range = DateRange(
        start=date.fromisoformat(available_date_range.start_date),
        end=date.fromisoformat(available_date_range.end_date),
    )

    # Build query filter for monthly overall summary report
    item_detail_query_filter = MonthlySummaryReportQueryFilter(
        date_range=date_range,
        subscription_list=[
            "Subscription_ID_001", "Subscription_ID_002", "Subscription_ID_100"
        ], # suggest to put 100 subscription id 
        carbon_scope_list=[EmissionScopeEnum.SCOPE1, EmissionScopeEnum.SCOPE2, EmissionScopeEnum.SCOPE3]
    )

    with open(f"carbon_emission_monthly_overall_summary_report.json", "a", encoding="utf-8") as f:
        result_list = carbon_service.query_carbon_emission_reports(item_detail_query_filter)

        for item in result_list.value:
            f.write(json.dumps(item.as_dict(), ensure_ascii=False))
            f.write("\n")

def get_latest_available_carbon_data_date_range() -> CarbonEmissionDataAvailableDateRange:
    """
    Query the latest available carbon data date range.
    """
    available_date_range = carbon_service.query_carbon_emission_data_available_date_range()

    print(f"Available date range: {available_date_range.start_date} to {available_date_range.end_date}")

    return available_date_range

if __name__ == "__main__":
    # get latest available carbon data date range
    get_latest_available_carbon_data_date_range()

    # get carbon emission item detail report
    query_item_detail_data_by_category_type(CategoryTypeEnum.RESOURCE)
    query_item_detail_data_by_category_type(CategoryTypeEnum.LOCATION)
    query_item_detail_data_by_category_type(CategoryTypeEnum.RESOURCE_TYPE)
    query_item_detail_data_by_category_type(CategoryTypeEnum.RESOURCE_GROUP)
    query_item_detail_data_by_category_type(CategoryTypeEnum.SUBSCRIPTION)

    # get top items monthly report
    query_top_items_monthly_report_by_category_type(CategoryTypeEnum.RESOURCE)
    query_top_items_monthly_report_by_category_type(CategoryTypeEnum.RESOURCE_GROUP)
    query_top_items_monthly_report_by_category_type(CategoryTypeEnum.LOCATION)
    query_top_items_monthly_report_by_category_type(CategoryTypeEnum.RESOURCE_TYPE)
    query_top_items_monthly_report_by_category_type(CategoryTypeEnum.SUBSCRIPTION)

    # get top items report
    query_top_items_report_by_category_type(CategoryTypeEnum.RESOURCE)
    query_top_items_report_by_category_type(CategoryTypeEnum.RESOURCE_GROUP)
    query_top_items_report_by_category_type(CategoryTypeEnum.LOCATION)
    query_top_items_report_by_category_type(CategoryTypeEnum.RESOURCE_TYPE)
    query_top_items_report_by_category_type(CategoryTypeEnum.SUBSCRIPTION)

    # get overall summary report
    query_overall_summary_report_by_category_type()

    # get monthly overall summary report
    query_monthly_overall_summary_report_by_category_type()

A Python-szkript futtatása

Futtassa a Python-szkriptet a parancssorból vagy a PowerShell-ablakból (rendszergazdai jogosultságokkal):

python export_carbon_emission_data.py

A JSON kimeneti fájljai ugyanabban a könyvtárban jönnek létre, mint a szkript. A fájlok neve jelentéstípus szerint van elnevezve.

Íme a létrehozott kimeneti fájlok listája:

  • carbon_emission_location_item_detail_report.json
  • carbon_emission_location_top_items_monthly_report.json
  • carbon_emission_location_top_items_report.json
  • carbon_emission_monthly_overall_summary_report.json
  • carbon_emission_overall_summary_report.json
  • carbon_emission_resourcegroup_item_detail_report.json
  • carbon_emission_resourcegroup_top_items_monthly_report.json
  • carbon_emission_resourcegroup_top_items_report.json
  • carbon_emission_resourcetype_item_detail_report.json
  • carbon_emission_resourcetype_top_items_monthly_report.json
  • carbon_emission_resourcetype_top_items_report.json
  • carbon_emission_resource_item_detail_report.json
  • carbon_emission_resource_top_items_monthly_report.json
  • carbon_emission_resource_top_items_report.json
  • carbon_emission_subscription_item_detail_report.json
  • carbon_emission_subscription_top_items_monthly_report.json
  • carbon_emission_subscription_top_items_report.json

A JSON kimeneti fájljainak áttekintése

Íme egy példa a havi összesített összefoglaló jelentés kimenetére a carbon_emission_overall_summary_report.json fájlból.

{"dataType": "OverallSummaryData", "latestMonthEmissions": 13871.2808902499, "previousMonthEmissions": 14007.1957894844, "monthOverMonthEmissionsChangeRatio": -0.00970321977912344, "monthlyEmissionsChangeValue": -135.91489923458}

A jelentésekről és az általuk tárolt adatokról további információt az Export emissions API-referencia című témakörben talál.

Következő lépés