Green-Software-Foundation / carbon-aware-sdk

Carbon-Aware SDK
https://carbon-aware-sdk.greensoftware.foundation/
MIT License
481 stars 99 forks source link

[Bug]: Cannot get the value of a token type 'Null' as a number #571

Closed trent-s closed 1 month ago

trent-s commented 1 month ago

Contact Details

trent@jp.ibm.com

What happened?

Thank you for your excellent work on this highly beneficial project! I would like to report code behavior which might possibly be improved. Thank you for your assistance with this.

Using the latest Carbon Aware SDK installed on OpenShift via Helm Cart, sometimes the query returns an error. When querying with a different location, or trying late, the problem often goes away. (All locations are valid locations reported by the locations endpoint.

Rather than displaying an error, it would be nice if the SDK took kind of action to return usable if reduced data. e.g., ignore null values, or possibly replace a null value with the average of surrounding values.

Example of error output:

$ curl -s  "http://webapi-green-software-foundation.apps.hostname.com/emissions/bylocation?location=japanwest"
{"title":"InvalidOperationException","status":400,"detail":"Cannot get the value of a token type 'Null' as a number.","errors":{},"traceId":"00-403a86f8315bc34fb13700f4dff0af2f-d7ccb83c87226e2b-01"}

Example of working query:

$ curl -s  "http://webapi-green-software-foundation.apps.hostname.com/emissions/bylocation?location=japaneast"
[{"location":"japaneast","time":"2024-09-30T06:00:00+00:00","rating":537,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T07:00:00+00:00","rating":576,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T08:00:00+00:00","rating":597,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T09:00:00+00:00","rating":598,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T10:00:00+00:00","rating":597,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T11:00:00+00:00","rating":596,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T12:00:00+00:00","rating":594,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T13:00:00+00:00","rating":593,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T14:00:00+00:00","rating":593,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T15:00:00+00:00","rating":592,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T16:00:00+00:00","rating":592,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T17:00:00+00:00","rating":592,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T18:00:00+00:00","rating":593,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T19:00:00+00:00","rating":593,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T20:00:00+00:00","rating":593,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T21:00:00+00:00","rating":568,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T22:00:00+00:00","rating":512,"duration":"01:00:00"},{"location":"japaneast","time":"2024-09-30T23:00:00+00:00","rating":468,"duration":"01:00:00"},{"location":"japaneast","time":"2024-10-01T00:00:00+00:00","rating":442,"duration":"01:00:00"},{"location":"japaneast","time":"2024-10-01T01:00:00+00:00","rating":435,"duration":"01:00:00"},{"location":"japaneast","time":"2024-10-01T02:00:00+00:00","rating":461,"duration":"01:00:00"},{"location":"japaneast","time":"2024-10-01T03:00:00+00:00","rating":461,"duration":"01:00:00"},{"location":"japaneast","time":"2024-10-01T04:00:00+00:00","rating":456,"duration":"01:00:00"},{"location":"japaneast","time":"2024-10-01T05:00:00+00:00","rating":456,"duration":"01:00:00"}]

Possibly irrelevant, but when this error happens, the json string returned from the http call found in the log seems to always include "carbonIntensity":null. For example see the last stanza(segment?) of this json string:

$ curl -s "https://api.electricitymap.org/v3/carbon-intensity/history?lat=34.6939&lon=135.5022"
{"zone":"JP-KN","history":[{"zone":"JP-KN","carbonIntensity":355,"datetime":"2024-09-30T06:00:00.000Z","updatedAt":"2024-09-30T08:47:49.231Z","createdAt":"2024-09-27T06:45:30.231Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":384,"datetime":"2024-09-30T07:00:00.000Z","updatedAt":"2024-09-30T09:44:56.916Z","createdAt":"2024-09-27T07:46:44.814Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":396,"datetime":"2024-09-30T08:00:00.000Z","updatedAt":"2024-09-30T10:46:07.249Z","createdAt":"2024-09-27T08:45:46.073Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":396,"datetime":"2024-09-30T09:00:00.000Z","updatedAt":"2024-09-30T11:48:53.206Z","createdAt":"2024-09-27T09:49:23.416Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":391,"datetime":"2024-09-30T10:00:00.000Z","updatedAt":"2024-09-30T12:45:41.615Z","createdAt":"2024-09-27T10:46:09.604Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":385,"datetime":"2024-09-30T11:00:00.000Z","updatedAt":"2024-09-30T14:45:44.322Z","createdAt":"2024-09-27T11:46:44.771Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":374,"datetime":"2024-09-30T12:00:00.000Z","updatedAt":"2024-09-30T14:45:39.623Z","createdAt":"2024-09-27T12:47:09.349Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":363,"datetime":"2024-09-30T13:00:00.000Z","updatedAt":"2024-09-30T15:45:03.406Z","createdAt":"2024-09-27T13:47:03.502Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":356,"datetime":"2024-09-30T14:00:00.000Z","updatedAt":"2024-09-30T15:45:03.406Z","createdAt":"2024-09-27T14:45:41.213Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":347,"datetime":"2024-09-30T15:00:00.000Z","updatedAt":"2024-09-30T18:47:45.232Z","createdAt":"2024-09-27T15:45:24.164Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":334,"datetime":"2024-09-30T16:00:00.000Z","updatedAt":"2024-09-30T18:47:45.232Z","createdAt":"2024-09-27T16:47:22.790Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":328,"datetime":"2024-09-30T17:00:00.000Z","updatedAt":"2024-09-30T20:48:08.096Z","createdAt":"2024-09-27T17:48:09.473Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":333,"datetime":"2024-09-30T18:00:00.000Z","updatedAt":"2024-09-30T20:48:08.096Z","createdAt":"2024-09-27T18:45:31.249Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":338,"datetime":"2024-09-30T19:00:00.000Z","updatedAt":"2024-09-30T21:48:56.140Z","createdAt":"2024-09-27T19:49:35.100Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":334,"datetime":"2024-09-30T20:00:00.000Z","updatedAt":"2024-09-30T22:45:40.144Z","createdAt":"2024-09-27T20:49:07.038Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":330,"datetime":"2024-09-30T21:00:00.000Z","updatedAt":"2024-10-01T00:45:36.256Z","createdAt":"2024-09-27T21:44:59.622Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":305,"datetime":"2024-09-30T22:00:00.000Z","updatedAt":"2024-10-01T00:45:18.796Z","createdAt":"2024-09-27T22:45:47.709Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":290,"datetime":"2024-09-30T23:00:00.000Z","updatedAt":"2024-10-01T01:45:06.937Z","createdAt":"2024-09-27T23:45:06.971Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":281,"datetime":"2024-10-01T00:00:00.000Z","updatedAt":"2024-10-01T02:46:58.049Z","createdAt":"2024-09-28T00:46:20.889Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":271,"datetime":"2024-10-01T01:00:00.000Z","updatedAt":"2024-10-01T03:46:21.509Z","createdAt":"2024-09-28T01:46:42.070Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":270,"datetime":"2024-10-01T02:00:00.000Z","updatedAt":"2024-10-01T04:49:20.198Z","createdAt":"2024-09-28T02:46:49.436Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":309,"datetime":"2024-10-01T03:00:00.000Z","updatedAt":"2024-10-01T04:49:20.198Z","createdAt":"2024-09-28T03:44:47.008Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":315,"datetime":"2024-10-01T04:00:00.000Z","updatedAt":"2024-10-01T04:49:20.198Z","createdAt":"2024-09-28T04:45:52.592Z","emissionFactorType":"lifecycle","isEstimated":true,"estimationMethod":"MODE_BREAKDOWN"},{"zone":"JP-KN","carbonIntensity":null,"datetime":"2024-10-01T05:00:00.000Z","updatedAt":"2024-10-01T04:48:46.113Z","createdAt":"2024-09-28T05:43:25.908Z","emissionFactorType":"lifecycle","isEstimated":false,"estimationMethod":null}]}

client

WebAPI (Default)

Relevant log output

info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://webapi-green-software-foundation.apps.hostname.com/emissions/bylocation?location=japanwest - - -
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'CarbonAware.WebApi.Controllers.CarbonAwareController.GetEmissionsDataForLocationByTime (CarbonAware.WebApi)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[102]
      Route matched with {action = "GetEmissionsDataForLocationByTime", controller = "CarbonAware"}. Executing controller action with signature System.Threading.Tasks.Task`1[Microsoft.AspNetCore.Mvc.IActionResult] GetEmissionsDataForLocationByTime(System.String, System.Nullable`1[System.DateTimeOffset], System.Nullable`1[System.DateTimeOffset]) on controller CarbonAware.WebApi.Controllers.CarbonAwareController (CarbonAware.WebApi).
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[101]
      Executing action method CarbonAware.WebApi.Controllers.CarbonAwareController.GetEmissionsDataForLocationByTime (CarbonAware.WebApi) - Validation state: Valid
info: System.Net.Http.HttpClient.ElectricityMapsClient.LogicalHandler[100]
      Start processing HTTP request GET https://api.electricitymap.org/v3/carbon-intensity/history?lat=34.6939&lon=135.5022
info: System.Net.Http.HttpClient.ElectricityMapsClient.ClientHandler[100]
      Sending HTTP request GET https://api.electricitymap.org/v3/carbon-intensity/history?lat=34.6939&lon=135.5022
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://10.129.5.132:8080/health - - -
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Health checks'
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://10.129.5.132:8080/health - - -
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'Health checks'
Activity.TraceId:            27fa5e3618b19c588e93ab0b0c474e34
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'Health checks'
Activity.SpanId:             386a8113f0908754
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished HTTP/1.1 GET http://10.129.5.132:8080/health - 200 - text/plain 0.0979ms
Activity.TraceFlags:         Recorded
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'Health checks'
Activity.ActivitySourceName: Microsoft.AspNetCore
Activity.DisplayName:        /health
Activity.Kind:               Server
Activity.StartTime:          2024-10-01T05:01:58.9543104Z
Activity.Duration:           00:00:00.0001416
Activity.Tags:
    net.host.name: 10.129.5.132
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished HTTP/1.1 GET http://10.129.5.132:8080/health - 200 - text/plain 0.0626ms
    net.host.port: 8080
    http.method: GET
    http.scheme: http
    http.target: /health
    http.url: http://10.129.5.132:8080/health
    http.flavor: 1.1
    http.user_agent: kube-probe/1.27
    http.status_code: 200
Resource associated with Activity:
    service.name: CarbonAware.WebAPI
    service.version: 1.0.0
    service.instance.id: ca9e91e7-dede-4d73-9f10-b19f455a2c8f
    telemetry.sdk.name: opentelemetry
    telemetry.sdk.language: dotnet
    telemetry.sdk.version: 1.6.0

Activity.TraceId:            fce4ac15662581aa3100c0c398e7394a
Activity.SpanId:             d67bdb8ce69e446b
Activity.TraceFlags:         Recorded
Activity.ActivitySourceName: Microsoft.AspNetCore
Activity.DisplayName:        /health
Activity.Kind:               Server
Activity.StartTime:          2024-10-01T05:01:58.9543852Z
Activity.Duration:           00:00:00.0000926
Activity.Tags:
    net.host.name: 10.129.5.132
    net.host.port: 8080
    http.method: GET
    http.scheme: http
    http.target: /health
    http.url: http://10.129.5.132:8080/health
    http.flavor: 1.1
    http.user_agent: kube-probe/1.27
    http.status_code: 200
Resource associated with Activity:
    service.name: CarbonAware.WebAPI
    service.version: 1.0.0
    service.instance.id: ca9e91e7-dede-4d73-9f10-b19f455a2c8f
    telemetry.sdk.name: opentelemetry
    telemetry.sdk.language: dotnet
    telemetry.sdk.version: 1.6.0

Activity.TraceId:            403a86f8315bc34fb13700f4dff0af2f
Activity.SpanId:             c573bf6c28812d5a
Activity.TraceFlags:         Recorded
Activity.ParentSpanId:       d7ccb83c87226e2b
Activity.ActivitySourceName: System.Net.Http
Activity.DisplayName:        HTTP GET
Activity.Kind:               Client
Activity.StartTime:          2024-10-01T05:01:58.8895662Z
Activity.Duration:           00:00:00.4006496
Activity.Tags:
    http.scheme: https
    http.method: GET
    net.peer.name: api.electricitymap.org
    http.url: https://api.electricitymap.org/v3/carbon-intensity/history?lat=34.6939&lon=135.5022
    http.flavor: 1.1
    http.status_code: 200
Resource associated with Activity:
    service.name: CarbonAware.WebAPI
    service.version: 1.0.0
    service.instance.id: ca9e91e7-dede-4d73-9f10-b19f455a2c8f
    telemetry.sdk.name: opentelemetry
    telemetry.sdk.language: dotnet
    telemetry.sdk.version: 1.6.0

info: System.Net.Http.HttpClient.ElectricityMapsClient.ClientHandler[101]
      Received HTTP response headers after 400.7663ms - 200
info: System.Net.Http.HttpClient.ElectricityMapsClient.LogicalHandler[101]
      End processing HTTP request after 400.8624ms - 200
fail: CarbonAware.WebApi.Filters.HttpResponseExceptionFilter[0]
      Exception: Cannot get the value of a token type 'Null' as a number.
      System.InvalidOperationException: Cannot get the value of a token type 'Null' as a number.
         at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_ExpectedNumber(JsonTokenType tokenType)
         at System.Text.Json.Utf8JsonReader.TryGetInt32(Int32& value)
         at System.Text.Json.Serialization.Converters.Int32Converter.ReadNumberWithCustomHandling(Utf8JsonReader& reader, JsonNumberHandling handling, JsonSerializerOptions options)
         at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
         at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
         at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
         at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
         at System.Text.Json.Serialization.JsonCollectionConverter`2.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, TCollection& value)
         at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
         at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
         at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
         at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value, Boolean& isPopulatedValue)
         at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
info: Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
      Executing ObjectResult, writing value of type 'Microsoft.AspNetCore.Http.HttpValidationProblemDetails'.
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[105]
      Executed action CarbonAware.WebApi.Controllers.CarbonAwareController.GetEmissionsDataForLocationByTime (CarbonAware.WebApi) in 408.0544ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'CarbonAware.WebApi.Controllers.CarbonAwareController.GetEmissionsDataForLocationByTime (CarbonAware.WebApi)'
Activity.TraceId:            403a86f8315bc34fb13700f4dff0af2f
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished HTTP/1.1 GET http://webapi-green-software-foundation.apps.hostname.com/emissions/bylocation?location=japanwest - 400 - application/problem+json;+charset=utf-8 408.3748ms
Activity.SpanId:             d7ccb83c87226e2b
Activity.TraceFlags:         Recorded
Activity.ActivitySourceName: Microsoft.AspNetCore
Activity.DisplayName:        emissions/bylocation
Activity.Kind:               Server
Activity.StartTime:          2024-10-01T05:01:58.8884255Z
Activity.Duration:           00:00:00.4084220
Activity.Tags:
    net.host.name: webapi-green-software-foundation.apps.hostname.com
    http.method: GET
    http.scheme: http
    http.target: /emissions/bylocation
    http.url: http://webapi-green-software-foundation.apps.hostname.com/emissions/bylocation?location=japanwest
    http.flavor: 1.1
    http.user_agent: curl/7.61.1
    http.route: emissions/bylocation
    http.status_code: 400
Resource associated with Activity:
    service.name: CarbonAware.WebAPI
    service.version: 1.0.0
    service.instance.id: ca9e91e7-dede-4d73-9f10-b19f455a2c8f
    telemetry.sdk.name: opentelemetry
    telemetry.sdk.language: dotnet
    telemetry.sdk.version: 1.6.0

Code of Conduct

YaSuenag commented 1 month ago

@trent-s
Thanks for your report! Did you configure Electricity Maps as a data source, right?

@vaughanknight @danuw @tiwatsuka
I guess it is caused by null value in carbon intensity what Scott suggested. Carbon intensity in HistoryCarbonIntensityData is defined as following:

https://github.com/Green-Software-Foundation/carbon-aware-sdk/blob/f05dcf435195fdea813a5a63178dc59c862134ad/src/CarbonAware.DataSources/CarbonAware.DataSources.ElectricityMaps/src/Model/HistoryCarbonIntensityData.cs#L31-L35

What do you think?

trent-s commented 1 month ago

@YaSuenag Thank you for your kind consideration. Yes I was using Electricity Maps for the data source. Thanks!

YaSuenag commented 1 month ago

@vaughanknight @danuw @tiwatsuka
I pushed fix proposal as https://github.com/YaSuenag/carbon-aware-sdk/commit/ba68e52a4ee133ba52323ba7ca65fce3eb10027f . I can send PR if it looks good.

YaSuenag commented 1 month ago

I didn't remove the data which carbonIntensity is null because EM datasource calcurates the duration from time differense between 2 elements in the array of the result. It should be kept to know valid duration.

danuw commented 1 month ago

@YaSuenag to create a PR so we can review the change and try and keep as primary focus. Thanks

trent-s commented 1 month ago

Thank you very much!

YaSuenag commented 1 month ago

@trent-s Thanks again for your report!

FYI: Carbon Aware SDK provides container image like a snapshot image. You can use it if you want to use fixed version without building. Use pre tag in GHCR: https://github.com/Green-Software-Foundation/carbon-aware-sdk/pkgs/container/carbon-aware-sdk

pre container would be built when the commit happens in dev (default) branch.

trent-s commented 1 month ago

I really appreciate your excellent work and useful information!