Skip to content

Commit

Permalink
Merge pull request #152 from fvaleye/feature/energy-consumption-and-c…
Browse files Browse the repository at this point in the history
…arbon-emission-details

Add the usage details in the energy consumption and carbon emissions generators
  • Loading branch information
fvaleye authored Mar 22, 2023
2 parents d091d94 + a2c6108 commit 419e41d
Show file tree
Hide file tree
Showing 9 changed files with 311 additions and 151 deletions.
4 changes: 4 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ jobs:

- name: Install Poetry
uses: abatilo/actions-poetry@v2
with:
poetry-version: 1.3.2 # hotfix

- name: Check Python
run: |
Expand Down Expand Up @@ -49,6 +51,8 @@ jobs:

- name: Install Poetry
uses: abatilo/actions-poetry@v2
with:
poetry-version: 1.3.2 # hotfix

- name: Run unit tests
run: |
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ jobs:

- name: Install Poetry
uses: abatilo/actions-poetry@v2
with:
poetry-version: 1.3.2 # hotfix

- name: Setup
run: make init
Expand All @@ -55,7 +57,9 @@ jobs:

- name: Install Poetry
uses: abatilo/actions-poetry@v2

with:
poetry-version: 1.3.2 # hotfix

- name: Setup
run: make init

Expand Down
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ ENV POETRY_CACHE_DIR=/opt/.cache
RUN rm -rf /var/lib/apt/lists/* & apt-get -y update && apt-get -y --no-install-recommends install python3 python3-pip

# Python
RUN pip install --upgrade pip && pip install poetry
RUN pip install --upgrade pip

# Install poetry separated from system interpreter and add it to PATH
RUN python3 -m venv $POETRY_VENV \
&& $POETRY_VENV/bin/pip install -U pip setuptools \
&& $POETRY_VENV/bin/pip install poetry
&& $POETRY_VENV/bin/pip install poetry==1.3.2
ENV PATH="${PATH}:${POETRY_VENV}/bin"

COPY . ./carbon-tracker
Expand Down
124 changes: 62 additions & 62 deletions poetry.lock

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions tests/cli/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ def test_run_metrics_should_be_ok(mocker, caplog):

run_metrics(exporter_name=exporter, running=False)

assert "Metric name[test.carbon_emission]" in caplog.text
assert "Metric name[test.energy_consumption]" in caplog.text
assert "Metric name[test.carbon_emission_host]" in caplog.text
assert "Metric name[test.energy_consumption_host]" in caplog.text
assert "units:co2g/kwh" in caplog.text
assert "units:watts" in caplog.text

Expand All @@ -63,7 +63,7 @@ def test_run_metrics_should_be_ok(mocker, caplog):

run_metrics(exporter_name=exporter, running=False, containers=True)

assert "Metric name[test.carbon_emission_kubernetes]" in caplog.text
assert "Metric name[test.energy_consumption_kubernetes]" in caplog.text
assert "Metric name[test.carbon_emission_kubernetes_total]" in caplog.text
assert "Metric name[test.energy_consumption_kubernetes_total]" in caplog.text
assert "units:co2mg/kwh" in caplog.text
assert "units:milliwatts" in caplog.text
115 changes: 107 additions & 8 deletions tests/test_general_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,34 @@ async def test_carbon_emission_metric(mocker):
mocker.patch.object(CarbonEmission, "get_energy_usage", return_value=energy_usage)
location = Country(name=location_name, co2g_kwh=51.1)
carbon_emission_generator = CarbonEmissionGenerator(location=location)
carbon_emission_metric = await carbon_emission_generator.generate().__anext__()
generator = carbon_emission_generator.generate()
carbon_emission_metric = await generator.__anext__()

assert carbon_emission_metric.name == "carbon_emission"
assert carbon_emission_metric.name == "carbon_emission_host"
assert carbon_emission_metric.tags[1] == Tag(key="location", value=location_name)
assert carbon_emission_metric.tags[2] == Tag(
key="source", value=location.co2g_kwh_source.value
)
assert carbon_emission_metric.tags[3] == Tag(key="units", value="co2g/kwh")

carbon_emission_metric = await generator.__anext__()
assert carbon_emission_metric.name == "carbon_emission_cpu"
assert carbon_emission_metric.tags[1] == Tag(key="location", value=location_name)
assert carbon_emission_metric.tags[2] == Tag(
key="source", value=location.co2g_kwh_source.value
)
assert carbon_emission_metric.tags[3] == Tag(key="units", value="co2g/kwh")

carbon_emission_metric = await generator.__anext__()
assert carbon_emission_metric.name == "carbon_emission_memory"
assert carbon_emission_metric.tags[1] == Tag(key="location", value=location_name)
assert carbon_emission_metric.tags[2] == Tag(
key="source", value=location.co2g_kwh_source.value
)
assert carbon_emission_metric.tags[3] == Tag(key="units", value="co2g/kwh")

carbon_emission_metric = await generator.__anext__()
assert carbon_emission_metric.name == "carbon_emission_gpu"
assert carbon_emission_metric.tags[1] == Tag(key="location", value=location_name)
assert carbon_emission_metric.tags[2] == Tag(
key="source", value=location.co2g_kwh_source.value
Expand All @@ -52,11 +77,25 @@ async def test_energy_consumption_metric(mocker):
)
location = Country(name=location_name, co2g_kwh=51.1)
energy_consumption_generator = EnergyConsumptionGenerator(location=location)
energy_consumption_metric = (
await energy_consumption_generator.generate().__anext__()
)
generator = energy_consumption_generator.generate()
energy_consumption_metric = await generator.__anext__()

assert energy_consumption_metric.name == "energy_consumption_host"
assert energy_consumption_metric.tags[1] == Tag(key="location", value=location_name)
assert energy_consumption_metric.tags[2] == Tag(key="units", value="watts")

energy_consumption_metric = await generator.__anext__()
assert energy_consumption_metric.name == "energy_consumption_cpu"
assert energy_consumption_metric.tags[1] == Tag(key="location", value=location_name)
assert energy_consumption_metric.tags[2] == Tag(key="units", value="watts")

assert energy_consumption_metric.name == "energy_consumption"
energy_consumption_metric = await generator.__anext__()
assert energy_consumption_metric.name == "energy_consumption_memory"
assert energy_consumption_metric.tags[1] == Tag(key="location", value=location_name)
assert energy_consumption_metric.tags[2] == Tag(key="units", value="watts")

energy_consumption_metric = await generator.__anext__()
assert energy_consumption_metric.name == "energy_consumption_gpu"
assert energy_consumption_metric.tags[1] == Tag(key="location", value=location_name)
assert energy_consumption_metric.tags[2] == Tag(key="units", value="watts")

Expand Down Expand Up @@ -104,7 +143,35 @@ async def test_energy_consumption_kubernetes_generator(mocker):
async_generator = energy_consumption_kubernertes_generator.generate()
metric = await async_generator.__anext__()
assert round(await metric.value(), 4) == milliwatts_expected
assert "energy_consumption_kubernetes" == metric.name
assert "energy_consumption_kubernetes_total" == metric.name
assert [
f"pod_name:{pod_name}",
f"pod_namespace:{namespace}",
f"container_name:{container_name}",
"platform:Darwin",
"containers:kubernetes",
f"location:{location_name}",
"units:milliwatts",
] == metric.format_tags()

milliwatts_expected = 4.9548
metric = await async_generator.__anext__()
assert round(await metric.value(), 4) == milliwatts_expected
assert "energy_consumption_kubernetes_cpu" == metric.name
assert [
f"pod_name:{pod_name}",
f"pod_namespace:{namespace}",
f"container_name:{container_name}",
"platform:Darwin",
"containers:kubernetes",
f"location:{location_name}",
"units:milliwatts",
] == metric.format_tags()

milliwatts_expected = 1.8368
metric = await async_generator.__anext__()
assert round(await metric.value(), 4) == milliwatts_expected
assert "energy_consumption_kubernetes_memory" == metric.name
assert [
f"pod_name:{pod_name}",
f"pod_namespace:{namespace}",
Expand Down Expand Up @@ -157,7 +224,39 @@ async def test_carbon_emission_kubernetes_generator(mocker):
async_generator = carbon_emission_kubernertes_generator.generate()
metric = await async_generator.__anext__()
assert round(await metric.value(), 4) == carbon_usage_expected
assert "carbon_emission_kubernetes" == metric.name
assert "carbon_emission_kubernetes_total" == metric.name
assert [
f"pod_name:{pod_name}",
f"pod_namespace:{namespace}",
f"container_name:{container_name}",
"platform:Darwin",
"containers:kubernetes",
f"location:{location_name}",
"source:file",
"units:co2mg/kwh",
] == metric.format_tags()

carbon_usage_expected = 200.00

metric = await async_generator.__anext__()
assert round(await metric.value(), 4) == carbon_usage_expected
assert "carbon_emission_kubernetes_cpu" == metric.name
assert [
f"pod_name:{pod_name}",
f"pod_namespace:{namespace}",
f"container_name:{container_name}",
"platform:Darwin",
"containers:kubernetes",
f"location:{location_name}",
"source:file",
"units:co2mg/kwh",
] == metric.format_tags()

carbon_usage_expected = 100.00

metric = await async_generator.__anext__()
assert round(await metric.value(), 4) == carbon_usage_expected
assert "carbon_emission_kubernetes_memory" == metric.name
assert [
f"pod_name:{pod_name}",
f"pod_namespace:{namespace}",
Expand Down
2 changes: 1 addition & 1 deletion tracarbon/exporters/datadog_exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ async def launch(self, metric_generator: MetricGenerator) -> None:
metric_name = metric.format_name(
metric_prefix_name=self.metric_prefix_name
)
logger.debug(
logger.info(
f"Sending metric[{metric_name}] with value [{metric_value}] and tags{metric.format_tags()} to Datadog."
)
self.stats.gauge(metric_name, metric_value, tags=metric.format_tags())
Expand Down
Loading

0 comments on commit 419e41d

Please sign in to comment.