Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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 ReadervagySubscription OwnerSubscription Contributorszerepkö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:
- Tekintse át az Azure CLI Windows rendszeren való telepítésével kapcsolatos információkat.
- Válasszon ki egy telepítési módszert, majd futtassa a helyi számítógéphez leginkább illő telepítőt.
- 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:
- Tekintse át a Python-letöltések adatait.
- 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
- 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 - Tekintse át a szkriptet, és cserélje le az összes példányt
Subscription_ID_XXXa 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. - 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.jsoncarbon_emission_location_top_items_monthly_report.jsoncarbon_emission_location_top_items_report.jsoncarbon_emission_monthly_overall_summary_report.jsoncarbon_emission_overall_summary_report.jsoncarbon_emission_resourcegroup_item_detail_report.jsoncarbon_emission_resourcegroup_top_items_monthly_report.jsoncarbon_emission_resourcegroup_top_items_report.jsoncarbon_emission_resourcetype_item_detail_report.jsoncarbon_emission_resourcetype_top_items_monthly_report.jsoncarbon_emission_resourcetype_top_items_report.jsoncarbon_emission_resource_item_detail_report.jsoncarbon_emission_resource_top_items_monthly_report.jsoncarbon_emission_resource_top_items_report.jsoncarbon_emission_subscription_item_detail_report.jsoncarbon_emission_subscription_top_items_monthly_report.jsoncarbon_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.