Atribuição do custo

Uma organização pode obter um insight do custo de utilização do Snowflake atribuindo esses custos a unidades lógicas dentro da organização (por exemplo, departamentos, ambientes e projetos). Este modelo de chargeback ou showback é útil para fins contábeis, mas também permite que uma organização identifique quais unidades estão gastando mais. Este insight ajuda a identificar áreas da organização que poderiam se beneficiar de controles e otimizações a fim de reduzir custos.

Neste tópico:

Visão geral

O Snowflake oferece um conjunto flexível de recursos de atribuição de custos que permitem às organizações atribuir custos em qualquer nível da hierarquia de objetos do Snowflake. Estes recursos podem atribuir o consumo de crédito a agrupamentos como centros de custo, ambientes e projetos. Snowflake fornece as seguintes estratégias de atribuição:

  • A marcação de objetos pode fornecer atribuição granular que permite atribuir o custo do uso de recursos individuais como um warehouse ou banco de dados a uma unidade específica dentro da organização.

  • A execução de consultas pode atribuir o uso do warehouse por função, usuário ou consulta, o que é particularmente útil quando vários centros de custo compartilham o mesmo warehouse.

Atribuição de custo de recursos individuais

A maneira mais direta e poderosa de atribuir custos a diferentes agrupamentos como departamentos, ambientes ou projetos é marcar recursos específicos usando a função marcação de objetos. Nesta estratégia, um administrador cria uma tag (por exemplo, cost_center), depois define uma lista de valores possíveis da tag (por exemplo, sales, finance). Neste exemplo, cada centro de custo recebe um valor de tag único. A combinação tag/valor é então atribuída aos recursos utilizados por um centro de custo. Como estes recursos consomem créditos, você pode executar relatórios agrupados pelo valor da tag. Como este valor de tag corresponde diretamente a um determinado agrupamento dentro da organização, os custos podem ser atribuídos com precisão.

A marcação de objetos permite atribuir custos com base em algo geral como uma conta ou algo específico como uma tabela. Note que nem todos os objetos marcáveis acumulam custos. Da perspectiva de gerenciamento de custos, a marcação de um objeto só faz sentido se houver uma exibição esquemática que contenha dados de uso ou de custos relacionados a esse objeto. Para uma lista das exibições de custos e uso do Snowflake, consulte Exploração do custo total.

Fluxo de trabalho de atribuição

O uso de tags de objeto para atribuir custos consiste em três tarefas básicas:

  1. Conceber uma estratégia de marcação e criar tags apropriadas.

  2. Marcar recursos com o par correto de tag/valor.

  3. Executar relatórios com base em dados de uso e tags.

Para ajudar a ilustrar este fluxo de trabalho, considere uma conta Snowflake que:

  • Tenha dois centros de custo: Vendas e Finanças.

  • Tenha três warehouses. Vendas usa Warehouse1 e Warehouse2, enquanto o departamento financeiro utiliza Warehouse3.

Three warehouses in an account

Neste exemplo, o objetivo é atribuir os custos de warehouse associados a cada warehouse ao departamento apropriado.

Nota

O exemplo a seguir assume que foram concedidos privilégios apropriados para a função tag_admin. Uma organização pode usar as permissões de marcação granulares para desenvolver uma estratégia de marcação segura.

Tarefa 1: Conceber uma estratégia de marcação e criar tags apropriadas

Para este exemplo, um administrador com os devidos privilégios cria uma única tag chamada cost_center.

use role tag_admin;
use schema my_db.my_schema;
create tag cost_center;
Copy
Tarefa 2: Marcar objetos com o par correto de tag/valor

O administrador da tag aplica o par tag/valor apropriado aos warehouses. Por exemplo, como o departamento de vendas utiliza ambos warehouse1 e warehouse2, a mesma combinação tag/valor é aplicada a estes dois recursos.

use role tag_admin;
alter warehouse warehouse1 set tag cost_center='SALES';
alter warehouse warehouse2 set tag cost_center='SALES';
alter warehouse warehouse3 set tag cost_center='FINANCE';
Copy

Nota

Se os administradores quiserem controlar quais valores podem ser definidos no objeto, eles podem usar o parâmetro opcional allowed_values ao criar a tag. Para obter mais detalhes, consulte CREATE TAG.

Tarefa 3: Executar relatórios com base em dados de uso e tags.

Você pode atribuir custos informando sobre o uso de recursos que tenham a tag cost_center. Estes dados estão disponíveis em Snowsight, the Snowflake web interface ou consultando o esquema SNOWFLAKE.ACCOUNT_USAGE.

Snowsight
  1. Mude para uma função que tenha acesso ao esquema ACCOUNT_USAGE.

  2. Navegue até Admin » Usage.

  3. No menu suspenso Tags, selecione a tag cost_center.

  4. Para se concentrar em um centro de custo específico, selecione um valor da lista de valores da tag.

  5. Clique em Apply.

Para obter mais detalhes sobre filtragem em Snowsight, consulte Como filtrar por tag.

SQL

O esquema Account Usage contém dados sobre o uso de recursos e as tags no esquema. A execução de uma consulta nas exibições neste esquema atribui o consumo de crédito dos warehouses ao centro de custo correto.

use snowflake.account_usage;
select tag_value as cost_center,
  sum(credits_used)
from warehouse_metering_history, tag_references
where warehouse_name=object_name
  and tag_name='COST_CENTER'
group by 1
order by 2 desc;
Copy

A consulta retorna um relatório como:

COST_CENTER

CREDITS_USED

SALES

17,173333333

FINANCE

8,14444444

Para obter mais detalhes completos sobre o uso de tags de objetos, consulte Marcação de objetos.

Atribuição de custo para um warehouse compartilhado

Em certos cenários, um warehouse é compartilhado entre várias equipes e é necessário dividir o custo do warehouse entre as equipes. Há três maneiras de separar o custo: por usuário, por função ou por uma tag de consulta personalizada. Cada uma delas é brevemente discutida, seguida pela consulta que é usada para gerar um relatório para cada abordagem.

Por usuário

Toda consulta que é executada em um warehouse virtual é associada ao usuário que executou a consulta. Estes dados estão disponíveis na coluna USER_NAME de Exibição QUERY_HISTORY. Você pode unir estes dados com os dados de uso na exibição WAREHOUSE_METERING_HISTORY para detalhar os custos do warehouse por usuário.

Por exemplo, se você modificou a consulta abaixo de para incluir USER_NAME, o relatório pode ficar assim:

USER_NAME

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

JOHN

WAREHOUSE1

11,255295833

SALLY

WAREHOUSE1

3,79444444

JOHN

WAREHOUSE2

1,636703054

Por função

Toda consulta que é executada em um warehouse virtual é associada à função que executa a consulta. Estes dados estão disponíveis na coluna ROLE_NAME de Exibição QUERY_HISTORY. Cada usuário do Snowflake tem pelo menos uma função.

Ao juntar a função da consulta da exibição QUERY_HISTORY com os dados de uso na exibição WAREHOUSE_METERING_HISTORY, o administrador de custos pode detalhar os custos do warehouse por função.

Por exemplo, se você modificou a consulta abaixo de para incluir ROLE_NAME, o relatório pode ficar assim:

ROLE_NAME

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

SALES_ADMIN

WAREHOUSE1

17,20239833

DEV_ADMIN

WAREHOUSE1

5,7990244

SALES_ADMIN

WAREHOUSE2

1,49765448

Por tag de consulta

Quando vários aplicativos compartilham o mesmo nome de usuário e warehouse, o parâmetro de sessão QUERY_TAG pode ajudar a atribuir o custo entre os aplicativos. Este parâmetro de sessão aplica uma tag às consultas e outras instruções SQL executadas dentro de uma sessão.

Para utilizar esta estratégia de atribuição, primeiro defina o QUERY_TAG para a sessão. Por exemplo:

ALTER SESSION SET QUERY_TAG = 'APP1'
Copy

Uma vez definido este parâmetro para a sessão, toda consulta que for executada durante a sessão é armazenada no Exibição QUERY_HISTORY junto com a tag de consulta APP1.

Para executar um relatório sobre os custos associados a determinadas tags de consulta, modifique a consulta abaixo para incluir QUERY_TAG. O resultado pode ficar assim:

QUERY_TAG

WAREHOUSE_NAME

APPROXIMATE_CREDITS_USED

SALES_APP

WAREHOUSE1

14,3027235

DEV_APP

WAREHOUSE1

11,2938568

SALES_APP

WAREHOUSE2

9,235620

Consulta: Dividir o uso do warehouse por usuário, função ou tag de consulta

Você pode usar uma consulta para gerar um relatório que divide os custos compartilhados do warehouse por usuário, por função ou por tag de consulta. Esta consulta é basicamente a mesma, independentemente de como os custos são separados. Ela une os metadados de consulta do Exibição QUERY_HISTORY com os dados de uso no Exibição WAREHOUSE_METERING_HISTORY para detalhar os custos do warehouse no último mês.

Para gerar um relatório, ajuste a seguinte consulta modificando as instruções SELECT para projetar a coluna apropriada da exibição QUERY_HISTORY. Por exemplo, se você estiver atribuindo custos de warehouse a várias funções, especifique a coluna ROLE_NAME.

-- Replace <query_metadata> with USER_NAME, ROLE_NAME, or QUERY_TAG

WITH HOUR_EXECUTION_TIME_CTE AS (
    SELECT <query_metadata>
      ,WAREHOUSE_NAME
      ,DATE_TRUNC('hour',START_TIME) as START_TIME_HOUR
      ,SUM(EXECUTION_TIME)  as HOUR_EXECUTION_TIME
    FROM "SNOWFLAKE"."ACCOUNT_USAGE"."QUERY_HISTORY"
    WHERE WAREHOUSE_NAME IS NOT NULL
    AND EXECUTION_TIME > 0

--Change the below filter if you want to look at a longer range than the last 1 month
    AND START_TIME > DATEADD(Month,-1,CURRENT_TIMESTAMP())
    group by 1,2,3
    )
, HOUR_EXECUTION_TOTAL_CTE AS (
    SELECT START_TIME_HOUR
      ,WAREHOUSE_NAME
      ,SUM(HOUR_EXECUTION_TIME) AS HOUR_EXECUTION_TOTAL
    FROM HOUR_EXECUTION_TIME_CTE
    group by 1,2
)
, HOUR_APPROXIMATE_CREDITS_USED AS (
    SELECT
      A.<query_metadata>
      ,C.WAREHOUSE_NAME
      ,(A.HOUR_EXECUTION_TIME/B.HOUR_EXECUTION_TOTAL)*C.CREDITS_USED AS HOUR_APPROXIMATE_CREDITS_USED

    FROM HOUR_EXECUTION_TIME_CTE A
    JOIN HOUR_EXECUTION_TOTAL_CTE B  ON A.START_TIME_HOUR = B.START_TIME_HOUR and B.WAREHOUSE_NAME = A.WAREHOUSE_NAME
    JOIN "SNOWFLAKE"."ACCOUNT_USAGE"."WAREHOUSE_METERING_HISTORY" C ON C.WAREHOUSE_NAME = A.WAREHOUSE_NAME AND C.START_TIME = A.START_TIME_HOUR
)

SELECT
  <query_metadata>
  , WAREHOUSE_NAME
  ,SUM(HOUR_APPROXIMATE_CREDITS_USED) AS APPROXIMATE_CREDITS_USED
FROM HOUR_APPROXIMATE_CREDITS_USED
GROUP BY 1, 2
ORDER BY 3 DESC
;
Copy