Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Fix] Fixed logging for underlying Go SDK #3917

Merged
merged 8 commits into from
Aug 20, 2024
Merged

Conversation

tanmay-db
Copy link
Contributor

@tanmay-db tanmay-db commented Aug 19, 2024

Changes

Go SDK doesn't contain valid context for terraform logger, due to this we get a nil logger from context: https://github.com/hashicorp/terraform-plugin-log/blob/main/tflog/provider.go#L40.

We always use the context from terraform and ignore the one from Go SDK.

Tests

TF_LOG=TRACE terraform apply won't print: https://github.com/databricks/databricks-sdk-go/blob/main/config/auth_default.go#L54 on main, prints it after change. Also tested manually for some debug statements.

Ran integration tests and see debug logs.

  • make test run locally
  • relevant change in docs/ folder
  • covered with integration tests in internal/acceptance
  • relevant acceptance tests are passing
  • using Go SDK

@tanmay-db tanmay-db requested review from a team as code owners August 19, 2024 15:13
@tanmay-db tanmay-db requested review from mgyucht and removed request for a team and mgyucht August 19, 2024 15:13
@tanmay-db tanmay-db changed the title [Fix] Fixed logging for underlying Go SDK [WIP][Fix] Fixed logging for underlying Go SDK Aug 19, 2024
@tanmay-db tanmay-db changed the title [WIP][Fix] Fixed logging for underlying Go SDK [Fix] Fixed logging for underlying Go SDK Aug 19, 2024
logger/logger.go Outdated Show resolved Hide resolved
@renaudhartert-db
Copy link
Contributor

renaudhartert-db commented Aug 19, 2024

I'm not sure I understand what the problem this PR is trying to fix really is. Is it correct that we want the Go SDK to log using the Terraform Logger?

If so, I'm not sure I understand why the Go SDK contexts are problematic. Aren't these given by the terraform provider?

@tanmay-db
Copy link
Contributor Author

Regarding the points:

  1. Yes we want Go SDK to log using Terraform logger (if it is running as part of terraform dependency).
  2. Go SDK contexts are problematic as these aren't given by terraform. We define context separately there, for example while Configuring we use refreshCtx that we set earlier as context.Background(): https://github.com/databricks/databricks-sdk-go/blob/main/config/config.go#L365

@renaudhartert-db
Copy link
Contributor

renaudhartert-db commented Aug 19, 2024

Go SDK contexts are problematic as these aren't given by terraform. We define context separately there, for example while Configuring we use refreshCtx that we set earlier as context.Background(): https://github.com/databricks/databricks-sdk-go/blob/main/config/config.go#L365

Thanks! That is the piece I was missing. We're essentially trying to build a "hack" around a bug in the Go SDK.

I wonder if we could consider an alternative solution that better encapsulate the "hack" so that the code is a little more future proof and less coupled.

My understanding is that the context that is being passed to SetLogger contains all the pieces we need to use. If that is correct, we could leverage that to build a new TfLogger that explicitly encapsulates these pieces. Something like that:

type TfLogger struct {
	name string
	ctx  context.Context
}

func NewTfLogger(ctx context.Context, name string) *TfLogger {
	return &TfLogger{
		name: name,
		ctx:  ctx,
	}
}

func SetLogger(l logger.Logger) {
	logger.DefaultLogger = l
}

// This function is always enabled because TfLogger implements the Logger
// interface from Go SDK and there we check if the logging is enabled based
// on level (which default to Info). This however isn't possible here since
// tflog isn't enabled / disabled based on log level. Omitting is done
// internally through the `ShouldOmit` method that filters based on logger
// configurations.
func (tfl *TfLogger) Enabled(_ context.Context, _ logger.Level) bool {
	return true
}

func (tfl *TfLogger) Tracef(ctx context.Context, format string, v ...any) {
	if tfl.name == "" {
		tflog.Trace(tfl.ctx, fmt.Sprintf(format, v...), nil)
	} else {
		tflog.SubsystemTrace(tfl.ctx, tfl.name, fmt.Sprintf(format, v...), nil)
	}
}

func (tfl *TfLogger) Debugf(ctx context.Context, format string, v ...any) {
	if tfl.name == "" {
		tflog.Debug(tfl.ctx, fmt.Sprintf(format, v...), nil)
	} else {
		tflog.SubsystemDebug(tfl.ctx, tfl.name, fmt.Sprintf(format, v...), nil)
	}
}

func (tfl *TfLogger) Infof(ctx context.Context, format string, v ...any) {
	if tfl.name == "" {
		tflog.Info(tfl.ctx, fmt.Sprintf(format, v...), nil)
	} else {
		tflog.SubsystemInfo(tfl.ctx, tfl.name, fmt.Sprintf(format, v...), nil)
	}
}

func (tfl *TfLogger) Warnf(ctx context.Context, format string, v ...any) {
	if tfl.name == "" {
		tflog.Warn(tfl.ctx, fmt.Sprintf(format, v...), nil)
	} else {
		tflog.SubsystemWarn(tfl.ctx, tfl.name, fmt.Sprintf(format, v...), nil)
	}
}

func (tfl *TfLogger) Errorf(ctx context.Context, format string, v ...any) {
	if tfl.name == "" {
		tflog.Error(tfl.ctx, fmt.Sprintf(format, v...), nil)
	} else {
		tflog.SubsystemError(tfl.ctx, tfl.name, fmt.Sprintf(format, v...), nil)
	}
}

What I like about this solution is that it doesn't rely on any global variable on the Terraform provider side. It also fully commits to a single interface to interact with Go SDK logging (i.e. the DefaultLogger) and literally ignores the context given to the logging methods — which I believe is a great thing as I'm having a hard time seeing the current logger interface remain in SDK V1.

What do you think?

return &TfLogger{ctx: ctx}
}

func SetTfLogger(tfLogger *TfLogger) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could have another method such as SetTfLoggerFromContext which will get a new logger and set it but I think it will lead to a loss of readability of code.

SetTfLogger(NewTfLogger(ctx)) clearly say we get a new logger first and set it.

ctx context.Context
}

func NewTfLogger(ctx context.Context) *TfLogger {
Copy link
Contributor

@renaudhartert-db renaudhartert-db Aug 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] I would just add a small comment here to explain that this function is expecting a certain type of context that contains a logger and not any context.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added

Copy link
Contributor

@renaudhartert-db renaudhartert-db left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — thanks for navigating me through the PR Tanmay.

@tanmay-db
Copy link
Contributor Author

Thanks for the review @renaudhartert-db

@tanmay-db tanmay-db enabled auto-merge August 20, 2024 15:51
@tanmay-db tanmay-db added this pull request to the merge queue Aug 20, 2024
Merged via the queue into main with commit 2d2b4d1 Aug 20, 2024
6 checks passed
@tanmay-db tanmay-db deleted the debug-logging-19aug branch August 20, 2024 15:56
tanmay-db added a commit that referenced this pull request Aug 22, 2024
### New Features and Improvements

 * Automatically create `parent_path` folder if it doesn't exist ([#3778](#3778)).

### Bug Fixes

 * Fixed logging for underlying Go SDK ([#3917](#3917)).
 * OPENAPI_SHA check ([#3935](#3935)).
 * Remove not necessary field in `databricks_job` schema ([#3907](#3907)).

### Internal Changes

 * Add AttributeBuilder for Plugin Framework schema ([#3922](#3922)).
 * Add CustomizableSchema for Plugin Framework ([#3927](#3927)).
 * Add StructToSchema for Plugin Framework ([#3928](#3928)).
 * Add codegen template and generated files for tfsdk structs ([#3911](#3911)).
 * Add converter functions and tests for plugin framework ([#3914](#3914)).
 * Added support to use protocol version 6 provider server for SDK plugin ([#3862](#3862)).
 * Bump Go SDK to v0.45.0 ([#3933](#3933)).
 * Change name with the aliases in codegen template ([#3936](#3936)).
 * Update jd version from latest to 1.8.1 ([#3915](#3915)).
 * Upgrade `staticcheck` to v0.5.1 to get Go 1.23 support ([#3931](#3931)).

### Exporter

 * Better support for notebooks with /Workspace path ([#3901](#3901)).
 * Improve exporting of DLT and test coverage ([#3898](#3898)).
github-merge-queue bot pushed a commit that referenced this pull request Aug 22, 2024
### New Features and Improvements

* Automatically create `parent_path` folder if it doesn't exist
([#3778](#3778)).


### Bug Fixes

* Fixed logging for underlying Go SDK
([#3917](#3917)).
* OPENAPI_SHA check
([#3935](#3935)).
* Remove not necessary field in `databricks_job` schema
([#3907](#3907)).


### Internal Changes

* Add AttributeBuilder for Plugin Framework schema
([#3922](#3922)).
* Add CustomizableSchema for Plugin Framework
([#3927](#3927)).
* Add StructToSchema for Plugin Framework
([#3928](#3928)).
* Add codegen template and generated files for tfsdk structs
([#3911](#3911)).
* Add converter functions and tests for plugin framework
([#3914](#3914)).
* Added support to use protocol version 6 provider server for SDK plugin
([#3862](#3862)).
* Bump Go SDK to v0.45.0
([#3933](#3933)).
* Change name with the aliases in codegen template
([#3936](#3936)).
* Update jd version from latest to 1.8.1
([#3915](#3915)).
* Upgrade `staticcheck` to v0.5.1 to get Go 1.23 support
([#3931](#3931)).


### Exporter

* Better support for notebooks with /Workspace path
([#3901](#3901)).
* Improve exporting of DLT and test coverage
([#3898](#3898)).
github-merge-queue bot pushed a commit that referenced this pull request Sep 17, 2024
### New Features and Improvements

* Add support for filters in `databricks_clusters` data source
([#4014](#4014)).
* Added `no_wait` option for clusters to skip waiting to start on
cluster creation
([#3953](#3953)).
* Introduced Plugin Framework
([#3920](#3920)).


### Bug Fixes

* Add suppress diff for `azure_attributes.spot_bid_max_price` in
`databricks_instance_pool`
([#3970](#3970)).
* Correctly send workload_type fields in `databricks_cluster` to allow
users to disable usage in certain contexts
([#3972](#3972)).
* Fix `databricks_sql_table` treatment of properties
([#3925](#3925)).
* Force send fields for settings resources
([#3978](#3978)).
* Handle cluster deletion in `databricks_library` read
([#3909](#3909)).
* Make subscriptions optional for SqlAlertTask
([#3983](#3983)).
* Permanently delete `ERROR` and `TERMINATED` state clusters if their
creation fails
([#4021](#4021)).


### Documentation

* Add troubleshooting guide for Provider
"registry.terraform.io/databricks/databricks" planned an invalid value
([#3961](#3961)).
* Adopt official naming of Mosaic AI Vector Search
([#3971](#3971)).
* Document Terraform 1.0 as minimum version
([#3952](#3952)).
* Mention Salesforce as supported type in `databricks_connection`
([#3949](#3949)).
* Reimplement Azure Databricks deployment guide to use VNet injection &
NPIP
([#3986](#3986)).
* Resolves
[#3127](#3127):
Remove deprecated account_id field from mws_credentials resource
([#3974](#3974)).
* Small Grammar Corrections in Docs
([#4006](#4006)).
* Update `databricks_vector_search_index` docs to match latest SDK
([#4008](#4008)).
* Update aws_unity_catalog_assume_role_policy.md
([#3968](#3968)).
* Update documentation regarding authentication with Azure-managed
Service Principal using GITHUB OIDC
([#3932](#3932)).
* Update metastore_assignment.md to properly reflect possible usage
([#3967](#3967)).
* Update minimum supported terraform version to 1.1.5
([#3965](#3965)).
* Update resources diagram to include newer resources
([#3962](#3962)).
* Update workspace_binding import command
([#3944](#3944)).
* fix possible values for `securable_type` in
`databricks_workspace_binding`
([#3942](#3942)).


### Internal Changes

* Add `AddPlanModifer` method for AttributeBuilder
([#4009](#4009)).
* Add integration tests for volumes and quality monitor plugin framework
([#3975](#3975)).
* Add support for `computed` tag in TfSDK Structs
([#4005](#4005)).
* Added `databricks_quality_monitor` resource and `databricks_volumes`
data source to plugin framework
([#3958](#3958)).
* Allow vector search tests to fail
([#3959](#3959)).
* Clean up comments in library resource
([#4015](#4015)).
* Fix irregularities in plugin framework converter function errors
([#4010](#4010)).
* Make test utils public and move integration test for quality monitor
([#3993](#3993)).
* Migrate Share resource to Go SDK
([#3916](#3916)).
* Migrate `databricks_cluster` data source to plugin framework
([#3988](#3988)).
* Migrate imports for terraform plugin framework + update init test
provider factory
([#3943](#3943)).
* Move volumes test next to plugin framework data source
([#3995](#3995)).
* Refactor provider and related packages
([#3940](#3940)).
* Support import in acceptance test + adding import state for quality
monitor
([#3994](#3994)).
* Library plugin framework migration
([#3979](#3979)).
* Fix `TestAccClusterResource_WorkloadType`
([#3989](#3989)).


### Dependency Updates

* Bump github.com/hashicorp/hcl/v2 from 2.21.0 to 2.22.0
([#3948](#3948)).
* Update Go SDK to 0.46.0
([#4007](#4007)).


### Exporter

* Don't generate instance pools if the pool name is empty
([#3960](#3960)).
* Expand list of non-interactive clusters
([#4023](#4023)).
* Ignore databricks_artifact_allowlist with zero artifact_matcher blocks
([#4019](#4019)).


## [Release] Release v1.51.0

### Breaking Changes

With this release, only protocol version 6 will be supported which is
compatible with terraform CLI version 1.1.5 and later. If you are using
an older version of the terraform CLI, please upgrade it to use this and
further releases of Databricks terraform provider.

### New Features and Improvements

* Automatically create `parent_path` folder when creating
`databricks_dashboard resource` if it doesn't exist
([#3778](#3778)).


### Bug Fixes

* Fixed logging for underlying Go SDK
([#3917](#3917)).
* Remove not necessary field in `databricks_job` schema
([#3907](#3907)).


### Internal Changes

* Add AttributeBuilder for Plugin Framework schema
([#3922](#3922)).
* Add CustomizableSchema for Plugin Framework
([#3927](#3927)).
* Add StructToSchema for Plugin Framework
([#3928](#3928)).
* Add codegen template and generated files for tfsdk structs
([#3911](#3911)).
* Add converter functions and tests for plugin framework
([#3914](#3914)).
* Added support to use protocol version 6 provider server for SDK plugin
([#3862](#3862)).
* Bump Go SDK to v0.45.0
([#3933](#3933)).
* Change name with the aliases in codegen template
([#3936](#3936)).
* Update jd version from latest to 1.8.1
([#3915](#3915)).
* Upgrade `staticcheck` to v0.5.1 to get Go 1.23 support
([#3931](#3931)).
* OPENAPI_SHA check
([#3935](#3935)).
* Use generic error for missing clusters
([#3938](#3938))


### Exporter

* Better support for notebooks with /Workspace path
([#3901](#3901)).
* Improve exporting of DLT and test coverage
([#3898](#3898)).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants