Serviços avançados do Looker Studio

Se o conector busca dados do BigQuery, é possível usar o Advanced Services do Looker Studio para otimizar o conector. Em vez de chamar a API BigQuery diretamente, você fornece uma configuração de consulta, e o Looker Studio busca os dados e o esquema para você.

Como funciona

Os conectores da comunidade que usam o Advanced Services do Looker Studio funcionam de maneira semelhante a um conector normal.

A grande diferença é a resposta esperada da execução das funções getSchema() e/ou getData(). Em vez de buscar e retornar um esquema e dados, essas funções podem retornar configurações de consulta. Quando uma configuração de consulta é retornada, o Looker Studio busca diretamente o esquema e/ou os dados com base na configuração de consulta fornecida.

Como desenvolver seu conector

Os conectores da comunidade que usam o Advanced Services do Looker Studio são iguais a um conector normal, com duas exceções.

  1. Uma chave de manifesto adicional
  2. Uma resposta diferente de getSchema() e/ou getData()

Referência do manifesto

No manifesto, defina as propriedades a seguir como true.

  • Para getSchema(), use a propriedade dataStudio.advancedServices.schema.
  • Para getData(), use a propriedade dataStudio.advancedServices.data.

Um valor de true indica que, para a respectiva função, o conector retornará uma configuração de consulta em vez da resposta padrão.

Para definir seu próprio esquema usando a resposta getSchema() padrão, defina dataStudio.advancedServices.schema como false no manifesto ou omita essa propriedade. Isso é necessário quando todos os campos no seu esquema não podem ser representados por uma única consulta do BigQuery, por exemplo, ao criar um conector de vários esquemas.

Como a consulta do BigQuery será executada em nome do usuário autorizado, também é necessário incluir o escopo do OAuth do BigQuery ("https://www.googleapis.com/auth/bigquery.readonly") no manifesto para solicitar autorização.

Veja a seguir um manifesto do conector com as credenciais do usuário autorizado para se conectar ao BigQuery:

{
  "dataStudio": {
    "name": "BigQuery Public Dataset Demo",
    "logoUrl": "https://www.gstatic.com/images/branding/product/1x/data_connector_48dp.png",
    "company": "Looker DevRel",
    "companyUrl": "https://developers.google.com/looker-studio/",
    "addOnUrl": "https://developers.google.com/looker-studio/",
    "supportUrl": "https://developers.google.com/looker-studio/",
    "description": "Use BigQuery public dataset with Looker Studio's Advanced Services.",
    "advancedServices": {
      "schema": true,
      "data": true
    }
  },
  "oauthScopes": ["https://www.googleapis.com/auth/bigquery.readonly"]
}

Se você estiver usando uma conta de serviço para acessar o BigQuery, o escopo bigquery.readonly do OAuth não será necessário no manifesto. No entanto, o escopo precisa ser adicionado à lista de escopos da conta de serviço.

Referências a getData e getSchema

Os conectores que usam o Advanced Services do Looker Studio retornam um objeto de configuração de consulta para getSchema() e/ou getData(). Dependendo da fonte de dados, essa configuração pode precisar de outras propriedades.

Veja a seguir um exemplo de como usar o serviço DataStudioApp para criar esse objeto de configuração:

var bqTypes = DataStudioApp.createCommunityConnector().BigQueryParameterType;
var configuration = DataStudioApp.createCommunityConnector().newBigQueryConfig()
    // BigQuery billing project's Id.
    .setBillingProjectId('billingProjectId')
    // The query that will be executed.
    .setQuery('myQueryString')
    // Set to `true` to use StandardSQL.
    .setUseStandardSql(true)
    // The accessToken used for service execution.
    .setAccessToken('myAccessToken')
    // Adding a `STRING` query parameter. Other supported types are `BOOL`,
    // `FLOAT64`, and `INT64`.
    .addQueryParameter('myUrlParameterName', bqTypes.STRING, 'myUrlParameterValue')
    .build();

Exemplo das funções getSchema() e getData()

var sqlString = "" +
    "SELECT " +
    "  _TABLE_SUFFIX AS yyyymm, " +
    "  ROUND(SUM(IF(fcp.start < @fast_fcp, fcp.density, 0)), 4) AS fast_fcp, " +
    "  ROUND(SUM(IF(fcp.start >= 1000 AND fcp.start < 3000, fcp.density, 0)), 4) AS avg_fcp, " +
    "  ROUND(SUM(IF(fcp.start >= 3000, fcp.density, 0)), 4) AS slow_fcp " +
    "FROM " +
    "  `chrome-ux-report.all.*`, " +
    "  UNNEST(first_contentful_paint.histogram.bin) AS fcp " +
    "WHERE " +
    "  origin = @url " +
    "GROUP BY " +
    "  yyyymm " +
    "ORDER BY " +
    "  yyyymm ";

function getQueryConfig(request) {
  var url = (request.configParams && request.configParams.url);
  var projectId = (request.configParams && request.configParams.projectId);
  var authToken = ScriptApp.getOAuthToken();
  return DataStudioApp.createCommunityConnector().newBigQueryConfig()
      .setAccessToken(authToken)
      .setUseStandardSql(true)
      .setBillingProjectId(projectId)
      .setQuery(sqlString)
      .addQueryParameter('url', bqTypes.STRING, url)
      .addQueryParameter('fast_fcp', bqTypes.INT64, '' + 1000)
      .build();
}

function getSchema(request) {
  return getQueryConfig(request);
}

function getData(request) {
  return getQueryConfig(request)
}