DEV Community

Cover image for Como criei um dashboard estratégico com Streamlit usando dados do Jira (sendo Product Owner)
Aline Daher for Proesc

Posted on

Como criei um dashboard estratégico com Streamlit usando dados do Jira (sendo Product Owner)

Como Product Owner, meu papel é atuar como um facilitador de decisões estratégicas, ajudando a liderança e o time a alcançar seus objetivos com base em dados precisos e acionáveis. No meu dia a dia, identifiquei uma necessidade crítica: acessar informações detalhadas e personalizadas sobre o desempenho do time técnico, composto por profissionais de dados, desenvolvedores, infraestrutura, UX e PMs.

A abordagem tradicional de obter essas informações diretamente no Jira provou ser recorrente, pouco escalável e custosa, principalmente pela dependência de aplicativos adicionais da plataforma. Diante desse cenário, resolvi criar o Tech Reports, um ambiente personalizado que me permite coletar métricas específicas e gerar relatórios sob medida, adaptados às demandas tanto do time quanto da liderança.

Essa iniciativa vai além das atribuições tradicionais da minha função, mas trouxe um impacto significativo ao meu trabalho. Com o Tech Reports, consegui otimizar processos, reduzir custos e, mais importante, garantir que dados confiáveis e relevantes estejam sempre disponíveis como base para decisões estratégicas.

Confira os tópicos que abordaremos hoje:

Vou explicar como esse projeto foi estruturado, os relatórios que implementei e o impacto que ele teve na equipe e na liderança.

Por que criar uma solução própria?

Embora o Jira ofereça ótimos recursos, nem todos atendem às necessidades específicas de times ou lideranças. Alguns impedimentos me motivaram a criar o Tech Reports

Custos adicionais: Muitos relatórios ou dashboards no Jira requerem plugins pagos.
Falta de personalização: As visões disponíveis nem sempre atendem às necessidades do time ou da liderança.
Tarefas repetitivas: Criação e gestão de sprints em múltiplos boards tomavam um tempo precioso.

A solução? Uma ferramenta personalizada que integra a API do Jira com dashboards interativos criados com Streamlit e Plotly.

Relatórios no ambiente

Os relatórios do Tech Reports foram desenvolvidos para trazer uma visão abrangente e detalhada das sprints e da capacidade das equipes. Aqui estão os principais relatórios e suas funcionalidades:

Quantitativo da sprint
Apresenta uma visão geral das tarefas da sprint, categorizando-as em: total, tarefas planejadas e tarefas não planejadas.
Esta segmentação permite compreender rapidamente o panorama da sprint em termos de volume e organização.

Entrega planejada vs não planejada
Compara a entrega de tarefas planejadas com as tarefas não planejadas, destacando a proporção entre elas. Esse comparativo ajuda a visualizar o equilíbrio entre demandas planejadas e urgências.

Resolução da sprint
Exibe o percentual de tarefas em cada status, oferecendo uma visão geral do progresso e da conclusão das atividades durante a sprint.

Tarefas não planejadas por setor
Analisa quais setores são responsáveis por originar o maior número de tarefas não planejadas, ajudando a identificar padrões e oportunidades de melhoria no planejamento.

Image description

Visão por squad
Detalha a distribuição de issues por membro do time, incluindo o status atual de cada tarefa, com uma visualização colorida para facilitar a identificação rápida.
Image description

Capacidade do squad
Apresenta a capacidade de trabalho de cada membro em horas estimadas, destacando potenciais sobrecargas ou subutilização de recursos.

Medição de horas trabalhadas e horas planejadas
Realiza a comparação entre as horas planejadas e as horas efetivamente trabalhadas por cada integrante da equipe, identificando desvios nas estimativas e na execução.

Disponibilidade da equipe por sprint
Mostra a capacidade remanescente de cada membro com base em um limite padrão de 75 horas por sprint, facilitando o gerenciamento de recursos e a alocação de novas tarefas.

Taxa de utilização
Indica a proporção de utilização de cada membro da equipe em relação à capacidade máxima estipulada, permitindo monitorar o ritmo de trabalho.
Image description

Distribuição de esforço por cargo
Fornece uma visão detalhada da divisão do esforço entre diferentes cargos dentro da sprint, com base no total de horas dedicadas.

Distribuição de esforço por issue
Apresenta a alocação percentual de issues por responsável, utilizando estimativas de horas como métrica principal, permitindo analisar a carga de trabalho individual de forma precisa.
Image description

Ferramentas e Tecnologias

Essas foram as ferramentas e bibliotecas que usei para dar vida ao projeto:

Streamlit: Framework para criar dashboards web de forma simples e rápida.
Requests: Para consumir e manipular dados da API do Jira.
Pandas: Para transformar e estruturar os dados.
Plotly: Para criar gráficos e visualizações interativas.
Streamlit-authenticator: Controle de acesso e autenticação de usuários.
Python-dotenv: Gerenciamento de variáveis sensíveis, como tokens de API.
Psycopg2: Conexão com banco de dados PostgreSQL
Openpyxl: Manipulação de relatórios em Excel.
Boto3: Integração com AWS para armazenar arquivos.

Nota: É necessário instalar o Streamlit antes de iniciar o projeto. Confira a documentação oficial para instruções de instalação.

Código em ação

1. Configurando a autenticação com a API do Jira
Antes de acessar os dados, configuramos a autenticação usando as credenciais armazenadas em variáveis de ambiente. Essas credenciais são codificadas em base64 para serem enviadas como parte do cabeçalho das requisições.

import base64
import os
from dotenv import load_dotenv

// Carrega variáveis de ambiente
load_dotenv()

// Configuração de credenciais 

jira_username = os.getenv("JIRA_USERNAME")
jira_api_token = os.getenv("JIRA_API_TOKEN")
jira_domain = os.getenv("JIRA_DOMAIN") 

// Codifica as credenciais para autenticação

jira_credentials = f"{jira_username}:{jira_api_token}"
jira_encoded_credentials = base64.b64encode(jira_credentials.encode()).decode("utf-8")

// Cabeçalhos para requisições
def get_jira_headers():
    return {
        "Authorization": f"Basic {jira_encoded_credentials}",
        "Content-Type": "application/json"
    }
Enter fullscreen mode Exit fullscreen mode

Dica: Certifique-se de configurar suas variáveis de ambiente corretamente no arquivo .env com as seguintes informações:

JIRA_USERNAME=seu_usuario
JIRA_API_TOKEN=seu_token
JIRA_DOMAIN=seu_dominio.atlassian.net
Enter fullscreen mode Exit fullscreen mode

2. Coletando sprints e issues
Usei a API para buscar todas as sprints ativas e fechadas de um board específico. Isso permite que o sistema exiba opções dinâmicas no dashboard.

@st.cache_data(show_spinner=False)
def get_all_sprints_for_board(board_id):
    headers = get_jira_headers()
    url = f"https://{jira_domain}/rest/agile/1.0/board/{board_id}/sprint?state=all"
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        sprints = response.json().get("values", [])
        return sorted(sprints, key=lambda x: x.get("startDate", ""), reverse=True)
    else:
        st.error("Erro ao buscar sprints.")
        return []
Enter fullscreen mode Exit fullscreen mode

Essa abordagem organiza as sprints em ordem cronológica, permitindo que o dashboard exiba dados recentes primeiro.

3. Processando e visualizando dados
Para transformar as informações das tarefas em insights úteis, criamos um DataFrame usando Pandas. Em seguida, utilizamos Plotly para visualizações interativas. Aqui está um exemplo de gráfico de pizza que mostra a distribuição de esforço por cargo:

@st.cache_data(show_spinner=False)
def process_issues_by_role(df):
    // Agrupa tarefas por cargo e ajusta horas
    df['Role'] = df['Assignee'].apply(assign_role)
    role_hours = df.groupby('Role')['Time Estimate'].sum().reset_index()
    return role_hours

// Exibição do gráfico
fig_role = px.pie(
    role_hours,
    names='Role',
    values='Time Estimate',
    title="Distribuição de Esforço por Cargo",
    width=800,
    height=600
)
st.plotly_chart(fig_role)
Enter fullscreen mode Exit fullscreen mode

4. Medindo capacidade e utilização
Um dos dashboards mais úteis é o de capacidade. Ele compara as horas planejadas e trabalhadas por cada membro da equipe:

fig_hours = px.bar(
    df_hours,
    x="Assignee",
    y=["Horas Planejadas", "Horas Trabalhadas"],
    barmode="group",
    title="Medição de Horas Planejadas vs Trabalhadas",
)
st.plotly_chart(fig_hours)
Enter fullscreen mode Exit fullscreen mode

Dica: Defina uma capacidade máxima por sprint (exemplo: 75 horas por membro) para calcular a disponibilidade restante de cada integrante do time.

Impacto no time e na liderança

Com o Tech Reports, consegui criar uma visão detalhada sobre o time técnico, englobando desde a capacidade de entrega até a performance em sprints. Alguns dos principais benefícios incluem:

Tomada de decisão baseada em dados: A liderança agora tem informações claras e precisas para orientar decisões estratégicas.
Maior visibilidade: Os gráficos permitem uma análise detalhada da saúde das sprints, da capacidade do time e do impacto das demandas.
Identificação de gargalos: Relatórios específicos, como o de tarefas não planejadas por setor, ajudam a entender os pontos críticos do fluxo de trabalho.
Planejamento mais preciso: A análise de capacidade e disponibilidade garante que o planejamento seja baseado em dados reais e não em suposições.
Maior eficiência operacional: A automatização de tarefas e a organização visual economizam tempo e reduzem custos com ferramentas adicionais.

Essas melhorias não apenas economizaram tempo, mas também aumentaram a eficiência e a precisão nas discussões de progresso e prioridades.

O Tech Reports é uma solução que integra dados, automação e visualizações interativas para transformar a forma como a equipe técnica e a liderança trabalham. Ao fornecer métricas claras, insights detalhados e automações inteligentes, ele se tornou um aliado indispensável para melhorar o planejamento e a execução de projetos.

Top comments (1)

Collapse
 
lumamontes profile image
Luma Montes

Muito bom!