Skip to content

Commit c76603e

Browse files
committed
REgionMappings return null instead of throwing exception + fix logic in AverageCarbonIntensity
Signed-off-by: Julien Nioche <julien@digitalpebble.com>
1 parent 354d499 commit c76603e

File tree

4 files changed

+35
-30
lines changed

4 files changed

+35
-30
lines changed

src/main/java/com/digitalpebble/spruce/modules/electricitymaps/AverageCarbonIntensity.java

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,32 @@
22

33
package com.digitalpebble.spruce.modules.electricitymaps;
44

5-
import com.digitalpebble.spruce.*;
6-
7-
import static com.digitalpebble.spruce.SpruceColumn.*;
8-
5+
import com.digitalpebble.spruce.Column;
6+
import com.digitalpebble.spruce.EnrichmentModule;
7+
import com.digitalpebble.spruce.Provider;
8+
import com.digitalpebble.spruce.Utils;
99
import com.digitalpebble.spruce.modules.realtimecloud.RegionMappings;
1010
import org.apache.spark.sql.Row;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
1113

1214
import java.io.IOException;
1315
import java.util.HashMap;
1416
import java.util.List;
1517
import java.util.Map;
1618

19+
import static com.digitalpebble.spruce.SpruceColumn.*;
20+
1721
/**
1822
* Populate the CARBON_INTENSITY field using ElecticityMaps' 2024 datasets
1923
* for rows where energy usage has been estimated.
2024
**/
2125
public class AverageCarbonIntensity implements EnrichmentModule {
2226

23-
private final Map<String, Double> average_intensities = new HashMap<>();
27+
private static final Logger log = LoggerFactory.getLogger(AverageCarbonIntensity.class);
2428

2529
private final static String DEFAULT_RESOURCE_LOCATION = "electricitymaps/averages_2024.csv";
30+
private final Map<String, Double> average_intensities = new HashMap<>();
2631

2732
public void init(Map<String, Object> params) {
2833
// load the averages for each EM IDs
@@ -53,11 +58,16 @@ public Column[] columnsNeeded() {
5358
}
5459

5560
/**
56-
Get the average intensity for the given region ID
57-
in gCO2perKWH
61+
* Get the average intensity for the given region ID
62+
* in gCO2perKWH
63+
* or null if the region does not exist
5864
*/
5965
protected Double getAverageIntensity(Provider provider, String regionId) {
6066
String emRegionId = RegionMappings.getEMRegion(provider, regionId);
67+
if (emRegionId == null) {
68+
log.info("Region unknown {} for {}", regionId, provider);
69+
return null;
70+
}
6171
return average_intensities.get(emRegionId);
6272
}
6373

@@ -79,16 +89,11 @@ public Row process(Row row) {
7989
}
8090

8191
// get intensity for the location
82-
try {
83-
final double coeff = getAverageIntensity(Provider.AWS, locationCode);
84-
if (coeff == 0.0d) {
85-
// if the coefficient is 0 it means that the region is not supported
86-
return row;
87-
}
88-
return EnrichmentModule.withUpdatedValue(row, CARBON_INTENSITY, coeff);
89-
} catch (Exception exception) {
90-
// if the region is not supported, we cannot compute the carbon intensity
92+
Double coeff = getAverageIntensity(Provider.AWS, locationCode);
93+
if (coeff == null) {
94+
// if the coefficient is 0 it means that the region is not supported
9195
return row;
9296
}
97+
return EnrichmentModule.withUpdatedValue(row, CARBON_INTENSITY, coeff);
9398
}
9499
}

src/main/java/com/digitalpebble/spruce/modules/realtimecloud/RegionMappings.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,14 @@ public class RegionMappings {
4646
*
4747
* @param p The cloud provider (e.g., AWS, GOOGLE, AZURE).
4848
* @param region The region name (e.g., "us-east-1").
49-
* @return The corresponding ElectricityMaps region ID.
50-
* @throws RuntimeException if the region is not supported.
49+
* @return The corresponding ElectricityMaps region ID or null if the region or provider is not supported.
5150
*/
5251
public static String getEMRegion(Provider p, String region) {
53-
5452
java.util.Map<String, String> regionMap = mappings.get(p);
55-
56-
String regionKey = regionMap.get(region);
57-
if (regionKey == null) {
58-
throw new RuntimeException("Unsupported region for provider " + p + ": " + region);
53+
if (regionMap == null) {
54+
return null;
5955
}
60-
return regionKey;
56+
return regionMap.get(region);
6157
}
6258

6359
}

src/test/java/com/digitalpebble/spruce/modules/electricitymaps/AverageCarbonIntensityTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,13 @@ void testGetAverageIntensity() {
1919
Double result = aci.getAverageIntensity(Provider.AWS, regionId);
2020
assertEquals(400.33, result);
2121
}
22+
23+
@Test
24+
void testUnknownRegion() {
25+
AverageCarbonIntensity aci = new AverageCarbonIntensity();
26+
aci.init(Map.of());
27+
String regionId = "us-blablabla-1";
28+
Double result = aci.getAverageIntensity(Provider.AWS, regionId);
29+
assertNull(result);
30+
}
2231
}

src/test/java/com/digitalpebble/spruce/modules/realtimecloud/RegionMappingsTest.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,6 @@ void testGetEMRegion_ValidMapping() {
1919

2020
@Test
2121
void testGetEMRegion_UnsupportedRegion() {
22-
Exception exception = assertThrows(RuntimeException.class, () ->
23-
RegionMappings.getEMRegion(Provider.AWS, "non-existent-region"));
24-
assertTrue(exception.getMessage().contains("Unsupported region"));
22+
assertNull(RegionMappings.getEMRegion(Provider.AWS, "non-existent-region"));
2523
}
26-
27-
28-
2924
}

0 commit comments

Comments
 (0)