From b94d77fd464236425c865f8e5492aa5864944a65 Mon Sep 17 00:00:00 2001 From: Gaurav Kumar <57063469+GrayFlash@users.noreply.github.com> Date: Tue, 7 Jun 2022 16:42:26 +0530 Subject: [PATCH] feat: add Instance_label to extractors (#354) * feat(postgres): add instance label through config for URN component * feat(mysql): add instance label through config for URN component * fix: missing build tag, instance_label to config * feat(mssql): add instance label through config for URN component * fix: missing build tag * feat(tableau): add instance label through config for URN component * refactor: rename to identifier * refactor(mysql): update README --- plugins/extractors/mssql/README.md | 4 +- plugins/extractors/mssql/mssql.go | 6 +- plugins/extractors/mssql/mssql_test.go | 5 +- plugins/extractors/mysql/README.md | 4 +- plugins/extractors/mysql/mysql.go | 7 +- plugins/extractors/mysql/mysql_test.go | 5 +- plugins/extractors/postgres/README.md | 3 +- plugins/extractors/postgres/postgres.go | 6 +- plugins/extractors/postgres/postgres_test.go | 5 +- plugins/extractors/tableau/README.md | 11 +- plugins/extractors/tableau/tableau.go | 16 +- plugins/extractors/tableau/tableau_test.go | 11 +- .../tableau/testdata/dashboards_proto.json | 178 +++++++++--------- 13 files changed, 142 insertions(+), 119 deletions(-) diff --git a/plugins/extractors/mssql/README.md b/plugins/extractors/mssql/README.md index 1844dc095..27dc1d7de 100644 --- a/plugins/extractors/mssql/README.md +++ b/plugins/extractors/mssql/README.md @@ -7,19 +7,21 @@ source: name: mssql config: connection_url: sqlserver://admin:pass123@localhost:3306/ + identifier: my-mssql ``` ## Inputs | Key | Value | Example | Description | | | :-- | :---- | :------ | :---------- | :- | +| `identifier` | `string` | `my-mssql` | Instance alias, the value will be used as part of the urn component | *required* | | `connection_url` | `string` | `sqlserver://admin:pass123@localhost:3306/` | URL to access the mssql server | *required* | ## Outputs | Field | Sample Value | | :---- | :---- | -| `resource.urn` | `my_database.my_table` | +| `resource.urn` | `mssql::my-mssql/my_database/my_table` | | `resource.name` | `my_table` | | `resource.service` | `mssql` | | `description` | `table description` | diff --git a/plugins/extractors/mssql/mssql.go b/plugins/extractors/mssql/mssql.go index 9642a92ad..14564614f 100644 --- a/plugins/extractors/mssql/mssql.go +++ b/plugins/extractors/mssql/mssql.go @@ -36,10 +36,12 @@ var defaultDBList = []string{ // Config holds the connection URL for the extractor type Config struct { ConnectionURL string `mapstructure:"connection_url" validate:"required"` + Identifier string `mapstructure:"identifier" validate:"required"` } var sampleConfig = ` -connection_url: "sqlserver://admin:pass123@localhost:3306/"` +connection_url: "sqlserver://admin:pass123@localhost:3306/" +identifier: my-mssql` // Extractor manages the extraction of data from the database type Extractor struct { @@ -132,7 +134,7 @@ func (e *Extractor) processTable(database string, tableName string) (err error) // push table to channel e.emit(models.NewRecord(&assetsv1beta1.Table{ Resource: &commonv1beta1.Resource{ - Urn: fmt.Sprintf("%s.%s", database, tableName), + Urn: models.TableURN("mssql", e.config.Identifier, database, tableName), Name: tableName, Type: "table", }, diff --git a/plugins/extractors/mssql/mssql_test.go b/plugins/extractors/mssql/mssql_test.go index c9762536f..f6067119a 100644 --- a/plugins/extractors/mssql/mssql_test.go +++ b/plugins/extractors/mssql/mssql_test.go @@ -96,6 +96,7 @@ func TestExtract(t *testing.T) { err := extr.Init(ctx, map[string]interface{}{ "connection_url": fmt.Sprintf("sqlserver://%s:%s@%s/", user, pass, host), + "identifier": "my-mssql", }) if err != nil { t.Fatal(err) @@ -146,7 +147,7 @@ func getExpected() []models.Record { return []models.Record{ models.NewRecord(&assetsv1beta1.Table{ Resource: &commonv1beta1.Resource{ - Urn: "mockdata_meteor_metadata_test.applicant", + Urn: "mssql::my-mssql/mockdata_meteor_metadata_test/applicant", Name: "applicant", Type: "table", }, @@ -175,7 +176,7 @@ func getExpected() []models.Record { }), models.NewRecord(&assetsv1beta1.Table{ Resource: &commonv1beta1.Resource{ - Urn: "mockdata_meteor_metadata_test.jobs", + Urn: "mssql::my-mssql/mockdata_meteor_metadata_test/jobs", Name: "jobs", Type: "table", }, diff --git a/plugins/extractors/mysql/README.md b/plugins/extractors/mysql/README.md index 12fbadcad..7df5bd853 100644 --- a/plugins/extractors/mysql/README.md +++ b/plugins/extractors/mysql/README.md @@ -7,6 +7,7 @@ source: name: mysql config: connection_url: admin:pass123@tcp(localhost:3306)/ + identifier: my-mysql ``` ## Inputs @@ -14,12 +15,13 @@ source: | Key | Value | Example | Description | | | :-- | :---- | :------ | :---------- | :- | | `connection_url` | `string` | `admin:pass123@tcp(localhost:3306)/` | URL to access the mysql server | *required* | +| `identifier` | `string` | `my-mysql` | Instance alias, the value will be used as part of the urn component | *required* | ## Outputs | Field | Sample Value | | :---- | :---- | -| `resource.urn` | `my_database.my_table` | +| `resource.urn` | `mysql::my-mysql/my_database/my_table` | | `resource.name` | `my_table` | | `resource.service` | `mysql` | | `description` | `table description` | diff --git a/plugins/extractors/mysql/mysql.go b/plugins/extractors/mysql/mysql.go index a541a2245..af3a229c6 100644 --- a/plugins/extractors/mysql/mysql.go +++ b/plugins/extractors/mysql/mysql.go @@ -35,9 +35,12 @@ var defaultDBList = []string{ // Config holds the connection URL for the extractor type Config struct { ConnectionURL string `mapstructure:"connection_url" validate:"required"` + Identifier string `mapstructure:"identifier" validate:"required"` } -var sampleConfig = `connection_url: "admin:pass123@tcp(localhost:3306)/"` +var sampleConfig = ` +connection_url: "admin:pass123@tcp(localhost:3306)/" +identifier: "my-mysql"` // Extractor manages the extraction of data from MySQL type Extractor struct { @@ -143,7 +146,7 @@ func (e *Extractor) processTable(database string, tableName string) (err error) // push table to channel e.emit(models.NewRecord(&assetsv1beta1.Table{ Resource: &commonv1beta1.Resource{ - Urn: fmt.Sprintf("%s.%s", database, tableName), + Urn: models.TableURN("mysql", e.config.Identifier, database, tableName), Name: tableName, Type: "table", }, diff --git a/plugins/extractors/mysql/mysql_test.go b/plugins/extractors/mysql/mysql_test.go index 6ad8e8c92..c7c5f5e5f 100644 --- a/plugins/extractors/mysql/mysql_test.go +++ b/plugins/extractors/mysql/mysql_test.go @@ -96,6 +96,7 @@ func TestExtract(t *testing.T) { err := extr.Init(ctx, map[string]interface{}{ "connection_url": fmt.Sprintf("%s:%s@tcp(%s)/", user, pass, host), + "identifier": "my-mysql", }) if err != nil { t.Fatal(err) @@ -152,7 +153,7 @@ func getExpected() []models.Record { return []models.Record{ models.NewRecord(&assetsv1beta1.Table{ Resource: &commonv1beta1.Resource{ - Urn: "mockdata_meteor_metadata_test.applicant", + Urn: "mysql::my-mysql/mockdata_meteor_metadata_test/applicant", Name: "applicant", Type: "table", }, @@ -184,7 +185,7 @@ func getExpected() []models.Record { }), models.NewRecord(&assetsv1beta1.Table{ Resource: &commonv1beta1.Resource{ - Urn: "mockdata_meteor_metadata_test.jobs", + Urn: "mysql::my-mysql/mockdata_meteor_metadata_test/jobs", Name: "jobs", Type: "table", }, diff --git a/plugins/extractors/postgres/README.md b/plugins/extractors/postgres/README.md index 0bfdaa76d..2f3128b5f 100644 --- a/plugins/extractors/postgres/README.md +++ b/plugins/extractors/postgres/README.md @@ -14,6 +14,7 @@ source: | Key | Value | Example | Description | | | :-- | :---- | :------ | :---------- | :- | +| `identifier` | `string` | `my-postgres` | Instance alias, the value will be used as part of the urn component | *required* | | `connection_url` | `string` | `postgres://admin:pass123@localhost:3306/testDB?sslmode=disable` | URL to access the postgres server | *required* | | `exclude` | `string` | `primaryDB,secondaryDB` | This is a comma separated db list | *optional* | @@ -21,7 +22,7 @@ source: | Field | Sample Value | | :---- | :---- | -| `resource.urn` | `postgres::localhost:3306/my_database/my_table` | +| `resource.urn` | `postgres::my-postgres/my_database/my_table` | | `resource.name` | `my_table` | | `resource.service` | `postgres` | | `description` | `table description` | diff --git a/plugins/extractors/postgres/postgres.go b/plugins/extractors/postgres/postgres.go index e78074408..9eb8b2324 100644 --- a/plugins/extractors/postgres/postgres.go +++ b/plugins/extractors/postgres/postgres.go @@ -34,11 +34,13 @@ var defaultDBList = []string{"information_schema", "root", "postgres"} type Config struct { ConnectionURL string `mapstructure:"connection_url" validate:"required"` Exclude string `mapstructure:"exclude"` + Identifier string `mapstructure:"identifier" validate:"required"` } var sampleConfig = ` connection_url: "postgres://admin:pass123@localhost:3306/postgres?sslmode=disable" -exclude: testDB,secondaryDB` +exclude: testDB,secondaryDB +identifier: my-postgres` // Extractor manages the extraction of data from the extractor type Extractor struct { @@ -171,7 +173,7 @@ func (e *Extractor) getTableMetadata(db *sql.DB, dbName string, tableName string result = &assetsv1beta1.Table{ Resource: &commonv1beta1.Resource{ - Urn: models.TableURN("postgres", e.host, dbName, tableName), + Urn: models.TableURN("postgres", e.config.Identifier, dbName, tableName), Name: tableName, Service: "postgres", Type: "table", diff --git a/plugins/extractors/postgres/postgres_test.go b/plugins/extractors/postgres/postgres_test.go index e8d7d9ba1..864f2ce6a 100644 --- a/plugins/extractors/postgres/postgres_test.go +++ b/plugins/extractors/postgres/postgres_test.go @@ -94,6 +94,7 @@ func TestExtract(t *testing.T) { err := extr.Init(ctx, map[string]interface{}{ "connection_url": fmt.Sprintf("postgres://%s:%s@%s/postgres?sslmode=disable", user, pass, host), + "identifier": "my-postgres", }) if err != nil { t.Fatal(err) @@ -148,7 +149,7 @@ func getExpected() []models.Record { return []models.Record{ models.NewRecord(&assetsv1beta1.Table{ Resource: &commonv1beta1.Resource{ - Urn: "postgres::localhost:5438/test_db/article", + Urn: "postgres::my-postgres/test_db/article", Name: "article", Service: "postgres", Type: "table", @@ -182,7 +183,7 @@ func getExpected() []models.Record { }), models.NewRecord(&assetsv1beta1.Table{ Resource: &commonv1beta1.Resource{ - Urn: "postgres::localhost:5438/test_db/post", + Urn: "postgres::my-postgres/test_db/post", Name: "post", Service: "postgres", Type: "table", diff --git a/plugins/extractors/tableau/README.md b/plugins/extractors/tableau/README.md index 164848d17..1f1a2d7f8 100644 --- a/plugins/extractors/tableau/README.md +++ b/plugins/extractors/tableau/README.md @@ -1,14 +1,18 @@ # tableau ## Usage + ### Note + To use tableau extractor, you need to enable [metadata service api](https://help.tableau.com/current/api/metadata_api/en-us/) + ```yaml source: type: tableau config: host: http://server.tableau.com version: 3.12 + identifier: my-tableau username: meteor_user password: xxxxxxxxxx ``` @@ -21,6 +25,7 @@ source: | :-- | :---- | :------ | :---------- | :- | | `host` | `string` | `https://server.tableau.com` | The host at which tableau is running | *required* | | `version` | `string` | `3.12` | The version of [Tableau REST API](https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_versions.htm), tested with 3.12 | *required* | +| `identifier` | `string` | `my-tableau` | Instance alias, the value will be used as part of the urn component | *required* | | `username` | `string` | `meteor_user` | Username/email to access the tableau | *required* | | `password` | `string` | `xxxxxxxxxx` | Password for the tableau | *required* | | `sitename` | `string` | `testdev550928` | The name of your tableau site, it will point to the default one if you leave it empty | *not required* | @@ -29,7 +34,7 @@ source: | Field | Sample Value | | :---- | :---- | -| `resource.urn` | `tableau::{host}/workbook/{workbook_id}` | +| `resource.urn` | `tableau::{identifier}/workbook/{workbook_id}` | | `resource.name` | `workbook_name` | | `resource.service` | `tableau` | | `resource.description` | `a description of the dashboard` | @@ -39,9 +44,9 @@ source: | Field | Sample Value | | :---- | :---- | -| `urn` | `tableau::{host}/sheet/{sheet_id}` | +| `urn` | `tableau::{identifier}/sheet/{sheet_id}` | | `source` | `tableau` | -| `dashboard_urn` | `tableau::{host}/workbook/{workbook_id}` | +| `dashboard_urn` | `tableau::{identifier}/workbook/{workbook_id}` | | `dashboard_source` | `tableau` | ## Contributing diff --git a/plugins/extractors/tableau/tableau.go b/plugins/extractors/tableau/tableau.go index d28e5f0dd..2ef32a89d 100644 --- a/plugins/extractors/tableau/tableau.go +++ b/plugins/extractors/tableau/tableau.go @@ -24,6 +24,7 @@ var summary string var sampleConfig = ` host: https://server.tableau.com version: 3.12 +identifier: my-tableau username: meteor_user password: xxxxxxxxxx sitename: testdev550928 @@ -31,11 +32,12 @@ sitename: testdev550928 // Config that holds a set of configuration for tableau extractor type Config struct { - Host string `mapstructure:"host" validate:"required"` - Version string `mapstructure:"version" validate:"required"` // float as string - Username string `mapstructure:"username" validate:"required"` - Password string `mapstructure:"password" validate:"required"` - Sitename string `mapstructure:"sitename"` + Host string `mapstructure:"host" validate:"required"` + Version string `mapstructure:"version" validate:"required"` // float as string + Identifier string `mapstructure:"identifier" validate:"required"` + Username string `mapstructure:"username" validate:"required"` + Password string `mapstructure:"password" validate:"required"` + Sitename string `mapstructure:"sitename"` } // Extractor manages the extraction of data @@ -129,7 +131,7 @@ func (e *Extractor) Extract(ctx context.Context, emit plugins.Emit) (err error) func (e *Extractor) buildDashboard(wb *Workbook) (data *assetsv1beta1.Dashboard, err error) { lineages := e.buildLineage(wb.UpstreamTables) - dashboardURN := models.DashboardURN("tableau", e.config.Host, fmt.Sprintf("workbook/%s", wb.ID)) + dashboardURN := models.DashboardURN("tableau", e.config.Identifier, fmt.Sprintf("workbook/%s", wb.ID)) data = &assetsv1beta1.Dashboard{ Resource: &commonv1beta1.Resource{ Urn: dashboardURN, @@ -170,7 +172,7 @@ func (e *Extractor) buildDashboard(wb *Workbook) (data *assetsv1beta1.Dashboard, func (e *Extractor) buildCharts(dashboardURN string, wb *Workbook, lineages *facetsv1beta1.Lineage) (charts []*assetsv1beta1.Chart) { for _, sh := range wb.Sheets { - chartURN := models.DashboardURN("tableau", e.config.Host, fmt.Sprintf("sheet/%s", sh.ID)) + chartURN := models.DashboardURN("tableau", e.config.Identifier, fmt.Sprintf("sheet/%s", sh.ID)) charts = append(charts, &assetsv1beta1.Chart{ Urn: chartURN, Name: sh.Name, diff --git a/plugins/extractors/tableau/tableau_test.go b/plugins/extractors/tableau/tableau_test.go index 201546847..7bb760a4e 100644 --- a/plugins/extractors/tableau/tableau_test.go +++ b/plugins/extractors/tableau/tableau_test.go @@ -52,11 +52,12 @@ func TestExtract(t *testing.T) { Transport: r, })) err = extr.Init(ctx, map[string]interface{}{ - "host": host, - "version": version, - "sitename": sitename, - "username": username, - "password": password, + "host": host, + "version": version, + "identifier": "my-tableau", + "sitename": sitename, + "username": username, + "password": password, }) if err != nil { t.Fatal(err) diff --git a/plugins/extractors/tableau/testdata/dashboards_proto.json b/plugins/extractors/tableau/testdata/dashboards_proto.json index 9d30926b0..11b137ae7 100644 --- a/plugins/extractors/tableau/testdata/dashboards_proto.json +++ b/plugins/extractors/tableau/testdata/dashboards_proto.json @@ -1,17 +1,17 @@ [ { "resource": { - "urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "name": "Regional", "service": "tableau", "type": "dashboard" }, "charts": [ { - "urn": "tableau::https://server.tableau.com/sheet/2f97fce2-e291-e229-842d-b7af508aebfc", + "urn": "tableau::my-tableau/sheet/2f97fce2-e291-e229-842d-b7af508aebfc", "name": "Obesity Map", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "dashboard_urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "properties": { "attributes": { "id": "2f97fce2-e291-e229-842d-b7af508aebfc", @@ -28,10 +28,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/4bef53d7-8b22-87f4-0077-c9c7bd090c08", + "urn": "tableau::my-tableau/sheet/4bef53d7-8b22-87f4-0077-c9c7bd090c08", "name": "S\u0026P Forward Returns", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "dashboard_urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "properties": { "attributes": { "id": "4bef53d7-8b22-87f4-0077-c9c7bd090c08", @@ -48,10 +48,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/68cf24ed-f83c-b6f5-0f0c-a884895d9016", + "urn": "tableau::my-tableau/sheet/68cf24ed-f83c-b6f5-0f0c-a884895d9016", "name": "Heat Map", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "dashboard_urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "properties": { "attributes": { "id": "68cf24ed-f83c-b6f5-0f0c-a884895d9016", @@ -68,10 +68,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/8616fd42-285c-4179-dea6-9f36e9f666e1", + "urn": "tableau::my-tableau/sheet/8616fd42-285c-4179-dea6-9f36e9f666e1", "name": "Scatter", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "dashboard_urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "properties": { "attributes": { "id": "8616fd42-285c-4179-dea6-9f36e9f666e1", @@ -88,10 +88,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/924ac46b-b979-72d5-27c8-e96251c4a982", + "urn": "tableau::my-tableau/sheet/924ac46b-b979-72d5-27c8-e96251c4a982", "name": "College", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "dashboard_urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "properties": { "attributes": { "id": "924ac46b-b979-72d5-27c8-e96251c4a982", @@ -108,10 +108,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/99c11133-00b6-dc1f-8e89-88e224f96210", + "urn": "tableau::my-tableau/sheet/99c11133-00b6-dc1f-8e89-88e224f96210", "name": "Flight Delays", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "dashboard_urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "properties": { "attributes": { "id": "99c11133-00b6-dc1f-8e89-88e224f96210", @@ -128,10 +128,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/a0f461b6-6236-8c90-aaeb-be8218441ada", + "urn": "tableau::my-tableau/sheet/a0f461b6-6236-8c90-aaeb-be8218441ada", "name": "Stocks", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "dashboard_urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "properties": { "attributes": { "id": "a0f461b6-6236-8c90-aaeb-be8218441ada", @@ -148,10 +148,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/b8b4b90b-783d-663d-2988-72781d4609cb", + "urn": "tableau::my-tableau/sheet/b8b4b90b-783d-663d-2988-72781d4609cb", "name": "S\u0026P Returns Vs Conditions", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "dashboard_urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "properties": { "attributes": { "id": "b8b4b90b-783d-663d-2988-72781d4609cb", @@ -168,10 +168,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/c997983b-144f-ec1b-6a0f-1dfdeef63a97", + "urn": "tableau::my-tableau/sheet/c997983b-144f-ec1b-6a0f-1dfdeef63a97", "name": "Obesity Scatter Plot", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "dashboard_urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "properties": { "attributes": { "id": "c997983b-144f-ec1b-6a0f-1dfdeef63a97", @@ -188,10 +188,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/d19fe52f-76db-a243-3381-56c40536dd18", + "urn": "tableau::my-tableau/sheet/d19fe52f-76db-a243-3381-56c40536dd18", "name": "S\u0026P Returns by Decade", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", + "dashboard_urn": "tableau::my-tableau/workbook/d74564cf-931c-2df2-fd8f-8b974fbc0b14", "properties": { "attributes": { "id": "d19fe52f-76db-a243-3381-56c40536dd18", @@ -273,7 +273,7 @@ }, { "resource": { - "urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "name": "Superstore", "service": "tableau", "type": "dashboard", @@ -281,10 +281,10 @@ }, "charts": [ { - "urn": "tableau::https://server.tableau.com/sheet/0421101f-cd87-a6b9-e502-eca8f8e96a3a", + "urn": "tableau::my-tableau/sheet/0421101f-cd87-a6b9-e502-eca8f8e96a3a", "name": "CustomerOverview", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "0421101f-cd87-a6b9-e502-eca8f8e96a3a", @@ -301,10 +301,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/109afef4-0607-b6d2-6219-7a7009a62a4c", + "urn": "tableau::my-tableau/sheet/109afef4-0607-b6d2-6219-7a7009a62a4c", "name": "QuotaAttainment", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "109afef4-0607-b6d2-6219-7a7009a62a4c", @@ -321,10 +321,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/18a57261-20d9-ad1f-50f7-8ce832517257", + "urn": "tableau::my-tableau/sheet/18a57261-20d9-ad1f-50f7-8ce832517257", "name": "What If Forecast", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "18a57261-20d9-ad1f-50f7-8ce832517257", @@ -341,10 +341,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/1cf1a77e-1aa7-82e4-d56f-4df6ef5804f0", + "urn": "tableau::my-tableau/sheet/1cf1a77e-1aa7-82e4-d56f-4df6ef5804f0", "name": "Product Detail Sheet", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "1cf1a77e-1aa7-82e4-d56f-4df6ef5804f0", @@ -361,10 +361,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/2481cc92-cf3b-4547-45c3-62bf55c84193", + "urn": "tableau::my-tableau/sheet/2481cc92-cf3b-4547-45c3-62bf55c84193", "name": "CustomerScatter", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "2481cc92-cf3b-4547-45c3-62bf55c84193", @@ -381,10 +381,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/363b1423-b446-28d1-d18a-f28676f5154b", + "urn": "tableau::my-tableau/sheet/363b1423-b446-28d1-d18a-f28676f5154b", "name": "Total Sales", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "363b1423-b446-28d1-d18a-f28676f5154b", @@ -401,10 +401,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/3d04aec6-e611-f775-de41-ab642f800a8a", + "urn": "tableau::my-tableau/sheet/3d04aec6-e611-f775-de41-ab642f800a8a", "name": "Sale Map", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "3d04aec6-e611-f775-de41-ab642f800a8a", @@ -421,10 +421,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/4d72181d-88d6-3fae-9824-67789cc0cbca", + "urn": "tableau::my-tableau/sheet/4d72181d-88d6-3fae-9824-67789cc0cbca", "name": "CommissionProjection", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "4d72181d-88d6-3fae-9824-67789cc0cbca", @@ -441,10 +441,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/52a3e355-d6c6-d4e3-f5b3-9f5ff7f432b3", + "urn": "tableau::my-tableau/sheet/52a3e355-d6c6-d4e3-f5b3-9f5ff7f432b3", "name": "ShipSummary", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "52a3e355-d6c6-d4e3-f5b3-9f5ff7f432b3", @@ -461,10 +461,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/64984186-af48-7b33-3c8b-e34950d0f8ac", + "urn": "tableau::my-tableau/sheet/64984186-af48-7b33-3c8b-e34950d0f8ac", "name": "Sales by Product", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "64984186-af48-7b33-3c8b-e34950d0f8ac", @@ -481,10 +481,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/74096ebd-7253-292a-b0a7-d8f4c9a617ca", + "urn": "tableau::my-tableau/sheet/74096ebd-7253-292a-b0a7-d8f4c9a617ca", "name": "Performance", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "74096ebd-7253-292a-b0a7-d8f4c9a617ca", @@ -501,10 +501,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/805d5e5e-1129-792c-0581-7f315c43829a", + "urn": "tableau::my-tableau/sheet/805d5e5e-1129-792c-0581-7f315c43829a", "name": "ProductDetails", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "805d5e5e-1129-792c-0581-7f315c43829a", @@ -521,10 +521,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/8c7702e7-3bce-1865-38b2-887ec3d1026a", + "urn": "tableau::my-tableau/sheet/8c7702e7-3bce-1865-38b2-887ec3d1026a", "name": "Tooltip: Profit Ratio by City", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "8c7702e7-3bce-1865-38b2-887ec3d1026a", @@ -541,10 +541,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/90f2fd1c-0ff2-1184-f37d-ebb6a2ac0ac8", + "urn": "tableau::my-tableau/sheet/90f2fd1c-0ff2-1184-f37d-ebb6a2ac0ac8", "name": "Forecast", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "90f2fd1c-0ff2-1184-f37d-ebb6a2ac0ac8", @@ -561,10 +561,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/960d1086-d0af-e4fb-1678-e70fb7b373c5", + "urn": "tableau::my-tableau/sheet/960d1086-d0af-e4fb-1678-e70fb7b373c5", "name": "ShippingTrend", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "960d1086-d0af-e4fb-1678-e70fb7b373c5", @@ -581,10 +581,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/a0073bd9-753c-be7c-d14c-4fdc70383e85", + "urn": "tableau::my-tableau/sheet/a0073bd9-753c-be7c-d14c-4fdc70383e85", "name": "OTE", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "a0073bd9-753c-be7c-d14c-4fdc70383e85", @@ -601,10 +601,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/ae2f7cbc-c788-1f4f-12d5-810f9c8be43a", + "urn": "tableau::my-tableau/sheet/ae2f7cbc-c788-1f4f-12d5-810f9c8be43a", "name": "CustomerRank", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "ae2f7cbc-c788-1f4f-12d5-810f9c8be43a", @@ -621,10 +621,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/c00babfb-1189-fe5c-b1bd-e8313f807b5c", + "urn": "tableau::my-tableau/sheet/c00babfb-1189-fe5c-b1bd-e8313f807b5c", "name": "Sales", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "c00babfb-1189-fe5c-b1bd-e8313f807b5c", @@ -641,10 +641,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/cae8a658-437f-af6e-5725-4c8a355bc2c3", + "urn": "tableau::my-tableau/sheet/cae8a658-437f-af6e-5725-4c8a355bc2c3", "name": "DaystoShip", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "cae8a658-437f-af6e-5725-4c8a355bc2c3", @@ -661,10 +661,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/e2b10503-01ce-aa3c-1dc0-a4200eedd98b", + "urn": "tableau::my-tableau/sheet/e2b10503-01ce-aa3c-1dc0-a4200eedd98b", "name": "Sales by Segment", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "e2b10503-01ce-aa3c-1dc0-a4200eedd98b", @@ -681,10 +681,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/f5981591-d5c1-8842-5edf-845d121c0afa", + "urn": "tableau::my-tableau/sheet/f5981591-d5c1-8842-5edf-845d121c0afa", "name": "ProductView", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", + "dashboard_urn": "tableau::my-tableau/workbook/e1f0aab7-e3ff-8727-8461-4d4294e220f0", "properties": { "attributes": { "id": "f5981591-d5c1-8842-5edf-845d121c0afa", @@ -751,17 +751,17 @@ }, { "resource": { - "urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "name": "InMail Engagement", "service": "tableau", "type": "dashboard" }, "charts": [ { - "urn": "tableau::https://server.tableau.com/sheet/3250190d-e1f8-3e1e-e43e-3485ea87990e", + "urn": "tableau::my-tableau/sheet/3250190d-e1f8-3e1e-e43e-3485ea87990e", "name": "Best Day to Send InMails", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "3250190d-e1f8-3e1e-e43e-3485ea87990e", @@ -778,10 +778,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/3b839abb-791b-8399-82a2-59915f9209be", + "urn": "tableau::my-tableau/sheet/3b839abb-791b-8399-82a2-59915f9209be", "name": "Number of InMail Sent", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "3b839abb-791b-8399-82a2-59915f9209be", @@ -798,10 +798,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/3ec1ba6c-c8dd-7641-45e4-a2b2154d0052", + "urn": "tableau::my-tableau/sheet/3ec1ba6c-c8dd-7641-45e4-a2b2154d0052", "name": "Tooltip: volume InMail sent vs accepted by weekday", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "3ec1ba6c-c8dd-7641-45e4-a2b2154d0052", @@ -818,10 +818,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/447bed17-7fb7-23c9-6207-78ed4c8bf769", + "urn": "tableau::my-tableau/sheet/447bed17-7fb7-23c9-6207-78ed4c8bf769", "name": "InMail Response Rate", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "447bed17-7fb7-23c9-6207-78ed4c8bf769", @@ -838,10 +838,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/514b6c67-f4a2-70e9-5fbb-c7ba97477532", + "urn": "tableau::my-tableau/sheet/514b6c67-f4a2-70e9-5fbb-c7ba97477532", "name": "Tooltip: volume InMail sent vs accepted by time of day and weekday", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "514b6c67-f4a2-70e9-5fbb-c7ba97477532", @@ -858,10 +858,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/881c5f1c-05c0-cccb-c778-0e9315d4d28f", + "urn": "tableau::my-tableau/sheet/881c5f1c-05c0-cccb-c778-0e9315d4d28f", "name": "InMail response rate by time of day", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "881c5f1c-05c0-cccb-c778-0e9315d4d28f", @@ -878,10 +878,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/98e3c68b-3d72-4522-99e3-82e62ae6943f", + "urn": "tableau::my-tableau/sheet/98e3c68b-3d72-4522-99e3-82e62ae6943f", "name": "All Team Memeber Engagement", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "98e3c68b-3d72-4522-99e3-82e62ae6943f", @@ -898,10 +898,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/9b98ebfa-f333-c487-4e39-8edf047499fa", + "urn": "tableau::my-tableau/sheet/9b98ebfa-f333-c487-4e39-8edf047499fa", "name": "Weekday by time of day response rate heatmap", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "9b98ebfa-f333-c487-4e39-8edf047499fa", @@ -918,10 +918,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/a3edae7b-a14f-69f7-c126-3cdcc0fc6427", + "urn": "tableau::my-tableau/sheet/a3edae7b-a14f-69f7-c126-3cdcc0fc6427", "name": "Best Time to Send InMails", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "a3edae7b-a14f-69f7-c126-3cdcc0fc6427", @@ -938,10 +938,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/a91805a6-403c-6797-caca-d5aa14ffa136", + "urn": "tableau::my-tableau/sheet/a91805a6-403c-6797-caca-d5aa14ffa136", "name": "InMail Response Rate Timeline", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "a91805a6-403c-6797-caca-d5aa14ffa136", @@ -958,10 +958,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/c5ddca41-13eb-a01a-0072-6aef8f1dd57b", + "urn": "tableau::my-tableau/sheet/c5ddca41-13eb-a01a-0072-6aef8f1dd57b", "name": "Tooltip: volume InMail sent vs accepted by time of day", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "c5ddca41-13eb-a01a-0072-6aef8f1dd57b", @@ -978,10 +978,10 @@ } }, { - "urn": "tableau::https://server.tableau.com/sheet/e8bde842-c7bc-57a0-8138-251190f520b1", + "urn": "tableau::my-tableau/sheet/e8bde842-c7bc-57a0-8138-251190f520b1", "name": "InMail response by weekday", "source": "tableau", - "dashboard_urn": "tableau::https://server.tableau.com/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", + "dashboard_urn": "tableau::my-tableau/workbook/d7db01c0-b311-6f47-31bf-ad1c42e67629", "properties": { "attributes": { "id": "e8bde842-c7bc-57a0-8138-251190f520b1",