1
1
package estimate
2
2
3
3
import (
4
+ "strings"
5
+
4
6
"github.com/carboniferio/carbonifer/internal/estimate/coefficients"
5
7
"github.com/carboniferio/carbonifer/internal/estimate/estimation"
6
8
@@ -15,56 +17,55 @@ func EstimateSupportedResource(resource resources.Resource) *estimation.Estimati
15
17
16
18
var computeResource resources.ComputeResource = resource .(resources.ComputeResource )
17
19
// Electric power used per unit of time
18
- avgWatt := estimateWattHour (& computeResource ) // Watt hour
19
- if viper .Get ("unit.power" ).(string ) == "kW" {
20
- avgWatt = avgWatt .Div (decimal .NewFromInt (1000 ))
21
- }
22
- if viper .Get ("unit.time" ).(string ) == "m" {
23
- avgWatt = avgWatt .Mul (decimal .NewFromInt (24 * 30 ))
24
- }
25
- if viper .Get ("unit.time" ).(string ) == "y" {
26
- avgWatt = avgWatt .Mul (decimal .NewFromInt (24 * 365 ))
27
- }
28
- avgWattStr := avgWatt .String ()
20
+ // It's computed first in watt per hour
21
+ avgWattHour := estimateWattHour (& computeResource ) // Watt hour
22
+ avgKWattHour := avgWattHour .Div (decimal .NewFromInt (1000 ))
29
23
30
24
// Regional grid emission per unit of time
25
+ // regionEmissions are in gCO2/kWh
31
26
regionEmissions , err := coefficients .RegionEmission (resource .GetIdentification ().Provider , resource .GetIdentification ().Region ) // gCO2eq /kWh
32
27
if err != nil {
33
28
log .Fatalf ("Error while getting region emissions for %v: %v" , resource .GetAddress (), err )
34
29
}
35
- if viper .Get ("unit.power" ).(string ) == "W" {
36
- regionEmissions .GridCarbonIntensity = regionEmissions .GridCarbonIntensity .Div (decimal .NewFromInt (1000 ))
30
+
31
+ // Carbon Emissions
32
+ carbonEmissionInGCO2PerH := avgKWattHour .Mul (regionEmissions .GridCarbonIntensity )
33
+ carbonEmissionPerTime := carbonEmissionInGCO2PerH
34
+ if strings .ToLower (viper .GetString ("unit.time" )) == "d" {
35
+ carbonEmissionPerTime = carbonEmissionPerTime .Mul (decimal .NewFromInt (24 ))
37
36
}
38
- if viper .Get ("unit.time" ).( string ) == "m" {
39
- regionEmissions . GridCarbonIntensity = regionEmissions . GridCarbonIntensity .Mul (decimal .NewFromInt (24 * 30 ))
37
+ if strings . ToLower ( viper .GetString ("unit.time" )) == "m" {
38
+ carbonEmissionPerTime = carbonEmissionPerTime .Mul (decimal .NewFromInt (24 * 30 ))
40
39
}
41
- if viper .Get ("unit.time" ).( string ) == "y" {
42
- regionEmissions . GridCarbonIntensity = regionEmissions . GridCarbonIntensity .Mul (decimal .NewFromInt (24 * 365 ))
40
+ if strings . ToLower ( viper .GetString ("unit.time" )) == "y" {
41
+ carbonEmissionPerTime = carbonEmissionPerTime .Mul (decimal .NewFromInt (24 * 365 ))
43
42
}
44
- if viper .Get ("unit.carbon" ).( string ) == "kg" {
45
- regionEmissions . GridCarbonIntensity = regionEmissions . GridCarbonIntensity .Div (decimal .NewFromInt (1000 ))
43
+ if strings . ToLower ( viper .GetString ("unit.carbon" )) == "kg" {
44
+ carbonEmissionPerTime = carbonEmissionPerTime .Div (decimal .NewFromInt (1000 ))
46
45
}
47
-
48
- // Carbon Emissions
49
- carbonEmissionPerTime := avgWatt .Mul (regionEmissions .GridCarbonIntensity )
50
46
carbonEmissionPerTimeStr := carbonEmissionPerTime .String ()
51
47
52
48
log .Debugf (
53
- "estimating resource %v.%v (%v): %v %v%v * %v %vCO2/%v%v = %v %vCO2/%v%v * %v" ,
49
+ "estimating resource %v.%v (%v): %v %v%v * %v %vCO2/%v%v = %v %vCO2/%v%v * %v = %v %vCO2/%v%v * %v " ,
54
50
computeResource .Identification .ResourceType ,
55
51
computeResource .Identification .Name ,
56
52
regionEmissions .Region ,
57
- avgWattStr ,
58
- viper . Get ( "unit.power" ).( string ) ,
59
- viper . Get ( "unit.time" ).( string ) ,
53
+ avgKWattHour . String () ,
54
+ "kW" ,
55
+ "h" ,
60
56
regionEmissions .GridCarbonIntensity ,
61
- viper .Get ("unit.carbon" ).(string ),
62
- viper .Get ("unit.power" ).(string ),
63
- viper .Get ("unit.time" ).(string ),
57
+ "g" ,
58
+ "kW" ,
59
+ "h" ,
60
+ carbonEmissionInGCO2PerH ,
61
+ "g" ,
62
+ "kW" ,
63
+ "h" ,
64
+ resource .GetIdentification ().Count ,
64
65
carbonEmissionPerTimeStr ,
65
- viper .Get ("unit.carbon" ).( string ),
66
- viper .Get ("unit.power" ).( string ),
67
- viper .Get ("unit.time" ).( string ),
66
+ viper .GetString ("unit.carbon" ),
67
+ viper .GetString ("unit.power" ),
68
+ viper .GetString ("unit.time" ),
68
69
resource .GetIdentification ().Count ,
69
70
)
70
71
@@ -77,7 +78,7 @@ func EstimateSupportedResource(resource resources.Resource) *estimation.Estimati
77
78
78
79
est := & estimation.EstimationResource {
79
80
Resource : & computeResource ,
80
- Power : avgWatt .RoundFloor (10 ),
81
+ Power : avgWattHour .RoundFloor (10 ),
81
82
CarbonEmissions : carbonEmissionPerTime .RoundFloor (10 ),
82
83
AverageCPUUsage : decimal .NewFromFloat (viper .GetFloat64 ("provider.gcp.avg_cpu_use" )).RoundFloor (10 ),
83
84
TotalCount : decimal .NewFromInt (count * replicationFactor ),
0 commit comments