GA Authentication fails repeatedly

Hi there,

I had an issue with GA Authentication, it was fixed by creating the connection again, worked for a couple of weeks and than failed again. How can this be fixed (hopefully more permanently)? Details below, I will be grateful for your help!

400 Bad Request
POST https://oauth2.googleapis.com/token
{
"error" : "invalid_grant",
"error_description" : "Bad Request"
}

LOG:
[d565796e-2485-462f-9056-321b39459d19] 2022-03-24T12:35:22+01:00 DEBUG metabase.server.middleware.log GET /api/table/1201/query_metadata 200 23.2 ms (9 DB calls) App DB connections: 0/15 Jetty threads: 3/50 (8 idle, 0 queued) (147 total active threads) Queries in flight: 0 (0 queued)
[d565796e-2485-462f-9056-321b39459d19] 2022-03-24T12:35:23+01:00 ERROR metabase.query-processor.middleware.catch-exceptions Error processing query: null
{:database_id 100,
:started_at #t "2022-03-24T11:35:22.461623Z[GMT]",
:json_query
{:database 100,
:query
{:aggregation [["metric" "ga:users"] ["metric" "ga:pageviews"]],
:breakout [["field" 18965 {:temporal-unit "week"}]],
:filter ["time-interval" ["field" 18965 nil] -365 "day"],
:source-table 1201},
:type "query",
:parameters [],
:middleware {:js-int-to-string? true, :add-default-userland-constraints? true}},
:native
{:query
{:include-empty-rows false,
:ids "ga:88257634",
:metrics "ga:users,ga:pageviews",
:dimensions "ga:yearWeek",
:start-date "365daysAgo",
:end-date "yesterday",
:sort "ga:yearWeek",
:max-results 10000},
:mbql? true},
:status :failed,
:class com.google.api.client.auth.oauth2.TokenResponseException,
:stacktrace
["com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:103)"
"com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:308)"
"com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:324)"
"com.google.api.client.auth.oauth2.Credential.executeRefreshToken(Credential.java:547)"
"com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:358)"
"com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:470)"
"com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:201)"
"com.google.api.client.http.HttpRequest.execute(HttpRequest.java:880)"
"com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:514)"
"com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:455)"
"com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:565)"
"--> driver.google$execute_no_auto_retry.invokeStatic(google.clj:38)"
"driver.google$execute_no_auto_retry.invoke(google.clj:33)"
"driver.google$execute.invokeStatic(google.clj:55)"
"driver.google$execute.invoke(google.clj:45)"
"driver.googleanalytics$execute_STAR_.invokeStatic(googleanalytics.clj:153)"
"driver.googleanalytics$execute_STAR_.invoke(googleanalytics.clj:151)"
"driver.googleanalytics.execute$execute_reducible_query.invokeStatic(execute.clj:126)"
"driver.googleanalytics.execute$execute_reducible_query.invoke(execute.clj:123)"
"driver.googleanalytics$fn__86383.invokeStatic(googleanalytics.clj:157)"
"driver.googleanalytics$fn__86383.invoke(googleanalytics.clj:155)"
"query_processor.context$executef.invokeStatic(context.clj:59)"
"query_processor.context$executef.invoke(context.clj:48)"
"query_processor.context.default$default_runf.invokeStatic(default.clj:68)"
"query_processor.context.default$default_runf.invoke(default.clj:66)"
"query_processor.context$runf.invokeStatic(context.clj:45)"
"query_processor.context$runf.invoke(context.clj:39)"
"query_processor.reducible$pivot.invokeStatic(reducible.clj:34)"
"query_processor.reducible$pivot.invoke(reducible.clj:31)"
"query_processor.middleware.mbql_to_native$mbql__GT_native$fn__50607.invoke(mbql_to_native.clj:25)"
"query_processor.middleware.check_features$check_features$fn__51353.invoke(check_features.clj:42)"
"query_processor.middleware.limit$limit$fn__48943.invoke(limit.clj:37)"
"query_processor.middleware.cache$maybe_return_cached_results$fn__51736.invoke(cache.clj:204)"
"query_processor.middleware.optimize_temporal_filters$optimize_temporal_filters$fn__52800.invoke(optimize_temporal_filters.clj:204)"
"query_processor.middleware.validate_temporal_bucketing$validate_temporal_bucketing$fn__52844.invoke(validate_temporal_bucketing.clj:50)"
"query_processor.middleware.auto_parse_filter_values$auto_parse_filter_values$fn__50664.invoke(auto_parse_filter_values.clj:43)"
"query_processor.middleware.wrap_value_literals$wrap_value_literals$fn__37386.invoke(wrap_value_literals.clj:161)"
"query_processor.middleware.annotate$add_column_info$fn__42217.invoke(annotate.clj:659)"
"query_processor.middleware.permissions$check_query_permissions$fn__47240.invoke(permissions.clj:108)"
"query_processor.middleware.pre_alias_aggregations$pre_alias_aggregations$fn__51958.invoke(pre_alias_aggregations.clj:40)"
"query_processor.middleware.cumulative_aggregations$handle_cumulative_aggregations$fn__47636.invoke(cumulative_aggregations.clj:60)"
"metabase_enterprise.sandbox.query_processor.middleware.row_level_restrictions$apply_row_level_permissions$fn__84700.invoke(row_level_restrictions.clj:338)"
"query_processor.middleware.visualization_settings$update_viz_settings$fn__47574.invoke(visualization_settings.clj:63)"
"query_processor.middleware.escape_join_aliases$escape_join_aliases_middleware$fn__48984.invoke(escape_join_aliases.clj:64)"
"query_processor.middleware.fix_bad_references$fix_bad_references_middleware$fn__51923.invoke(fix_bad_references.clj:91)"
"query_processor.middleware.resolve_joined_fields$resolve_joined_fields$fn__48521.invoke(resolve_joined_fields.clj:111)"
"query_processor.middleware.resolve_joins$resolve_joins$fn__52570.invoke(resolve_joins.clj:178)"
"query_processor.middleware.add_implicit_joins$add_implicit_joins$fn__52112.invoke(add_implicit_joins.clj:246)"
"query_processor.middleware.large_int_id$convert_id_to_string$fn__48540.invoke(large_int_id.clj:59)"
"query_processor.middleware.format_rows$format_rows$fn__52164.invoke(format_rows.clj:74)"
"query_processor.middleware.add_default_temporal_unit$add_default_temporal_unit$fn__47908.invoke(add_default_temporal_unit.clj:23)"
"query_processor.middleware.desugar$desugar$fn__47547.invoke(desugar.clj:21)"
"query_processor.middleware.binning$update_binning_strategy$fn__46487.invoke(binning.clj:229)"
"query_processor.middleware.resolve_fields$resolve_fields$fn__46882.invoke(resolve_fields.clj:34)"
"query_processor.middleware.add_dimension_projections$add_remapping$fn__51290.invoke(add_dimension_projections.clj:487)"
"query_processor.middleware.add_implicit_clauses$add_implicit_clauses$fn__51584.invoke(add_implicit_clauses.clj:164)"
"metabase_enterprise.sandbox.query_processor.middleware.row_level_restrictions$apply_row_level_permissions$fn__84700.invoke(row_level_restrictions.clj:338)"
"query_processor.middleware.upgrade_field_literals$upgrade_field_literals$fn__48928.invoke(upgrade_field_literals.clj:117)"
"query_processor.middleware.add_source_metadata$add_source_metadata_for_source_queries$fn__48285.invoke(add_source_metadata.clj:125)"
"metabase_enterprise.sandbox.query_processor.middleware.column_level_perms_check$maybe_apply_column_level_perms_check$fn__83099.invoke(column_level_perms_check.clj:30)"
"query_processor.middleware.reconcile_breakout_and_order_by_bucketing$reconcile_breakout_and_order_by_bucketing$fn__51835.invoke(reconcile_breakout_and_order_by_bucketing.clj:100)"
"query_processor.middleware.auto_bucket_datetimes$auto_bucket_datetimes$fn__49922.invoke(auto_bucket_datetimes.clj:147)"
"query_processor.middleware.resolve_source_table$resolve_source_tables$fn__46863.invoke(resolve_source_table.clj:45)"
"query_processor.middleware.parameters$substitute_parameters$fn__49576.invoke(parameters.clj:109)"
"query_processor.middleware.resolve_referenced$resolve_referenced_card_resources$fn__46936.invoke(resolve_referenced.clj:79)"
"query_processor.middleware.expand_macros$expand_macros$fn__53228.invoke(expand_macros.clj:184)"
"query_processor.middleware.add_timezone_info$add_timezone_info$fn__49356.invoke(add_timezone_info.clj:15)"
"query_processor.middleware.splice_params_in_response$splice_params_in_response$fn__52179.invoke(splice_params_in_response.clj:32)"
"query_processor.middleware.resolve_database_and_driver$resolve_database_and_driver$fn__51595$fn__51600.invoke(resolve_database_and_driver.clj:35)"
"driver$do_with_driver.invokeStatic(driver.clj:60)"
"driver$do_with_driver.invoke(driver.clj:56)"
"query_processor.middleware.resolve_database_and_driver$resolve_database_and_driver$fn__51595.invoke(resolve_database_and_driver.clj:34)"
"query_processor.middleware.fetch_source_query$resolve_card_id_source_tables$fn__47482.invoke(fetch_source_query.clj:286)"
"query_processor.middleware.store$initialize_store$fn__47673$fn__47674.invoke(store.clj:11)"
"query_processor.store$do_with_store.invokeStatic(store.clj:44)"
"query_processor.store$do_with_store.invoke(store.clj:38)"
"query_processor.middleware.store$initialize_store$fn__47673.invoke(store.clj:10)"
"query_processor.middleware.validate$validate_query$fn__51930.invoke(validate.clj:10)"
"query_processor.middleware.normalize_query$normalize$fn__51937.invoke(normalize_query.clj:22)"
"query_processor.middleware.add_rows_truncated$add_rows_truncated$fn__49302.invoke(add_rows_truncated.clj:35)"
"metabase_enterprise.audit_app.query_processor.middleware.handle_audit_queries$handle_internal_queries$fn__42923.invoke(handle_audit_queries.clj:130)"
"query_processor.middleware.results_metadata$record_and_return_metadata_BANG_$fn__50593.invoke(results_metadata.clj:82)"
"query_processor.middleware.constraints$add_default_userland_constraints$fn__49320.invoke(constraints.clj:42)"
"query_processor.middleware.process_userland_query$process_userland_query$fn__51871.invoke(process_userland_query.clj:146)"
"query_processor.middleware.catch_exceptions$catch_exceptions$fn__52259.invoke(catch_exceptions.clj:169)"
"query_processor.reducible$async_qp$qp_STAR___40953$thunk__40954.invoke(reducible.clj:103)"
"query_processor.reducible$async_qp$qp_STAR___40953.invoke(reducible.clj:109)"
"query_processor.reducible$sync_qp$qp_STAR___40962$fn__40965.invoke(reducible.clj:135)"
"query_processor.reducible$sync_qp$qp_STAR___40962.invoke(reducible.clj:134)"
"query_processor$process_userland_query.invokeStatic(query_processor.clj:247)"
"query_processor$process_userland_query.doInvoke(query_processor.clj:243)"
"query_processor$fn__53276$process_query_and_save_execution_BANG___53285$fn__53288.invoke(query_processor.clj:258)"
"query_processor$fn__53276$process_query_and_save_execution_BANG___53285.invoke(query_processor.clj:251)"
"query_processor$fn__53320$process_query_and_save_with_max_results_constraints_BANG___53329$fn__53332.invoke(query_processor.clj:270)"
"query_processor$fn__53320$process_query_and_save_with_max_results_constraints_BANG___53329.invoke(query_processor.clj:263)"
"api.dataset$run_query_async$fn__66034.invoke(dataset.clj:69)"
"query_processor.streaming$streaming_response_STAR_$fn__45396$fn__45397.invoke(streaming.clj:162)"
"query_processor.streaming$streaming_response_STAR_$fn__45396.invoke(streaming.clj:161)"
"async.streaming_response$do_f_STAR_.invokeStatic(streaming_response.clj:65)"
"async.streaming_response$do_f_STAR_.invoke(streaming_response.clj:63)"
"async.streaming_response$do_f_async$task__26894.invoke(streaming_response.clj:84)"],
:card_id nil,
:context :ad-hoc,
:error
"400 Bad Request\nPOST https://oauth2.googleapis.com/token\n{\n "error" : "invalid_grant",\n "error_description" : "Bad Request"\n}",
:row_count 0,
:running_time 0,
:preprocessed
{:database 100,
:query
{:aggregation
[[:aggregation-options [:metric "ga:users"] {:name "metric"}]
[:aggregation-options [:metric "ga:pageviews"] {:name "metric_2"}]],
:breakout [[:field 18965 {:temporal-unit :week}]],
:filter
[:and
[:>= [:field 18965 {:temporal-unit :default}] [:relative-datetime -365 :day]]
[:< [:field 18965 {:temporal-unit :default}] [:relative-datetime 0 :day]]],
:source-table 1201,
:order-by [[:asc [:field 18965 {:temporal-unit :week}]]]},
:type :query,
:middleware {:js-int-to-string? true, :add-default-userland-constraints? true},
:info
{:executed-by 167,
:context :ad-hoc,
:nested? false,
:query-hash
[-45, 67, -91, -74, -33, 89, -77, 103, 123, 120, -90, 107, -7, 62, 95, -93, -90, 4, -118, 20, -49, -42, -70, -26,
-115, -115, 0, 18, 74, 100, 76, 95]},
:constraints {:max-results 10000, :max-results-bare-rows 2000}},
:data {:rows [], :cols []}}

Hi @emilia.ch
Google decided to stop supporting their older API with two weeks notice.
You need to upgrade to latest release:
https://github.com/metabase/metabase/releases/latest
And follow the more complex Service Account setup:
https://www.metabase.com/docs/latest/administration-guide/databases/google-analytics.html

Thank you for such a quick answer! :slight_smile: