¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
¿Buscas nuestro logo?
Aquí te dejamos una copia, pero si necesitas más opciones o quieres conocer más, visita nuestra área de marca.
dev
Raúl Grande 22/03/2021 Cargando comentarios…
¿Has intentado alguna vez explotar de forma externa las métricas que Jira puede ofrecer? ¿Has conseguido obtener los tiempos que pasan en cada estado tus issues? Si te encuentras en un callejón sin salida, ¡sigue leyendo! Aquí vamos a explicar paso a paso cómo conseguirlo.
Seguro que si usas Jira estarás muy familiarizado con las numerosas métricas y gráficos que ofrece la herramienta out-of-the-box.
Estos son muy útiles en el día a día de los equipos que desarrollan software bajo métodos ágiles de trabajo. Sin embargo, es complicado obtener todos los datos necesarios para medir cosas tan importantes como el Lead Time, Cycle Time o Waste Time.
Pero si alguna vez has pensado en explotar de forma externa las diferentes métricas que pueden recogerse de Jira quizá hayas encontrado un gran impedimento: pueden extraerse casi todos los campos excepto el que nos sirve para conocer los estados por los que pasa cada tarea y el tiempo empleado en cada uno de ellos.
Sin ese dato no podremos analizar posibles cuellos de botella en nuestro equipo y, por tanto, perderemos la oportunidad de mejorar nuestros tiempos de entrega de valor.
En este post vamos a utilizar dos herramientas en la nube y mostraremos cómo pueden extraerse datos de Jira Cloud guardándolos en una hoja de Google Sheets de una forma automatizada. Para ello usaremos un add-on de Google Sheets llamado Jira Cloud for Sheets. Se trata de un add-on gratuito desarrollado por Atlassian de modo que podemos contar con soporte en el caso de tener algún comportamiento anómalo.
El primer paso es instalar el add-on en nuestra cuenta de Google:
Ahora lo que tenemos que hacer es obtener las issues de Jira mediante este add-on, para ello pinchamos en “Get Issues from Jira”. Hay que tener en cuenta que la exportación de las issues se realizará en la hoja en la que nos encontremos.
La opción “Import type” sirve para seleccionar el tipo de importación que realizaremos o, más bien, el modo de preguntar a Jira por nuestras issues. Hay 4 alternativas:
En este caso, usaremos sentencias JQL.
Ahora toca seleccionar qué campos vamos a extraer en cada una de las issues. Podemos filtrar por los campos de un proyecto en concreto o ver todos.
En este punto es importante señalar que, para obtener la información del tiempo que pasa la issue en cada estado, es necesario recoger el campo que se denomina “[CHART] Time in Status”. Comentar también que este campo únicamente viene informado en las tareas finalizadas, es algo que se debe tener siempre en cuenta a la hora de explotar los datos.
Una vez seleccionados los campos, automáticamente coloca cada uno de ellos en letras de las columnas de la hoja. Si queremos modificarlo, pinchamos en Edit y arrastramos cambiando el orden.
La tercera pestaña del add-on permite programar con qué frecuencia van a recogerse las issues. Puede hacerse manualmente mediante el botón GET ISSUES NOW o establecer una periodicidad para que los datos se refresquen automáticamente. Es posible que el add-on pida de nuevo autorización en la cuenta de Jira para ejecutar ese trabajo de forma desatendida.
Una vez se han completado estos 3 pasos, es necesario pinchar en el botón inferior (GET ISSUES NOW) y, pasados unos segundos que dependen de la cantidad de issues y campos seleccionados, las filas aparecerán rellenas con los datos extraídos de Jira.
Ahora ya podemos explotar los datos de manera externa. Si hemos elegido un refresco periódico, este se hará automáticamente en el momento programado. Esta opción es muy útil si tratamos todos estos datos desde una herramienta de reporting.
Podéis ampliar toda esta información en esta página.
Como habréis podido ver en la extracción anterior, cuando se selecciona el campo “[CHART] Time in Status” el contenido digamos que es poco claro. Contiene una cadena de texto similar a este ejemplo:
3_*:*_6_*:*_509823158_*|*_10000_*:*_1_*:*_90395_*|*_10232_*:*_6_*:*_26688191_*|*_10100_*:*_2_*:*_252342635_*|*_10001_*:*_1_*:*_0
Vamos a explicar cómo se desgrana esa información y cuál es el resultado que hemos obtenido. Cada grupo de esa cadena contiene los siguientes datos:
El mecanismo para obtener esos datos es el siguiente:
_*|*_
3_*:*_6_*:*_509823158
_*:*_
Ese patrón se repite en el resto de la cadena. De modo que con una expresión regular y usando una fórmula de Google Sheets podemos hacer más amigable el formato:
=SUSTITUIR(SUSTITUIR(H4;"_*|*_";";");"_*:*_";",")
Lo metemos en una columna nueva a la que llamaremos “Tiempo por estado” y obtendremos algo como esto:
3,6,509823158;10000,1,90395;10232,6,26688191;10100,2,252342635;10001,1,0
Vale, ¿y de dónde sacamos que el 3 es un estado? ¿Qué estado en concreto? ¿Y el resto de estados?
Para obtener respuesta a esas preguntas tenemos que acceder a esta URL de Jira donde se obtiene toda esa información: https://<instancia_jira>.atlassian.net/rest/api/2/status/
Por ejemplo, si trabajas para ACME es muy probable que tu URL sea algo como: https://acme.atlassian.net/rest/api/2/status/
En esa URL obtenemos un JSON donde hay un array con varios elementos. Cada uno de esos elementos representa los atributos que definen a un estado en nuestra instancia de Jira. No siempre los mismos estados tienen los mismos atributos y, por supuesto, puede haber múltiples variaciones en los estados definidos en cada instancia.
{
self: "https://<instancia_jira>.atlassian.net/rest/api/2/status/3",
description: "El responsable está trabajando actualmente en esta incidencia.",
iconUrl: "https://<instancia_jira>.atlassian.net/images/icons/statuses/inprogress.png",
name: "En curso",
untranslatedName: "In Progress",
id: "3",
statusCategory:
{
self: "https://<instancia_jira>.atlassian.net/rest/api/2/statuscategory/4",
id: 4,
key: "indeterminate",
colorName: "yellow",
name: "En curso"
}
}
Los campos que son relevantes en este momento son:
name: "En curso",
untranslatedName: "In Progress",
id: "3",
Con estos datos ya tenemos asociados los ids a cada uno de los estados.
NOTA: si no tenemos acceso a la URL https://<instancia_jira>.atlassian.net/rest/api/2/status/ podemos también obtener esta información, pero de una manera más tediosa:
Esta información es clave para poder obtener en nuestra hoja de Google Sheets las veces que se pasa por un estado y el tiempo total que se pasa en ese estado.
Por cada uno de los estados que queremos analizar tendremos una columna que sacará las veces y otra columna que sacará el tiempo (en nuestro caso, en días). Las fórmulas son las siguientes para el ejemplo de “In Progress”, donde la columna U almacena el “Tiempo por estado”:
=SI(LARGO (H13) =
0;;SI.ERROR(VALOR(REGEXEXTRACT(U13;"3,([0-9]+),.+"));0))
=SI(LARGO(H13) =
0;;SI.ERROR(VALOR(REGEXEXTRACT(U13;"3,.,([0-9]+)"))/1000/60/60/24;0))
Haremos los mismos cálculos en todos los estados que queramos tratar y finalmente tendremos algo similar a la siguiente captura, donde también podremos obtener otras métricas como el Cycle Time, Waste Time y el Lead Time, por ejemplo. Recordemos, como hemos dicho antes, que este campo solo viene informado para las issues finalizadas.
Si vamos a emplear tiempo en definir mecanismos para obtener esas métricas que nos hacen falta, lo mejor es que busquemos la forma más estándar para conseguirlo y que sirva para todos los equipos.
De esta forma podremos reutilizar esfuerzos. En este caso, recomendamos que el flujo utilizado en Jira sea lo más genérico posible pero que también recoja las particularidades de la mayoría de los equipos que lo estén utilizando.
Esto va a permitir que las métricas en todos los equipos puedan explotarse de la misma forma y estandarizar así el proceso de análisis de este tipo de KPIs en la compañía.
Una cultura de métricas es vital en el proceso de mejora continua de cualquier compañía. Porque como dijo William Thomson Kelvin a finales del s XIX: “Lo que no se define, no se puede medir. Lo que no se mide, no se puede mejorar. Lo que no se mejora, se degrada siempre”.
Para seguir en esta línea de métricas y, haciendo uso de herramientas cloud, en próximos posts explicaremos cómo pueden visualizarse en diferentes gráficos esta ingente cantidad de datos mediante la creación de un dashboard en Google DataStudio que esté conectado a la hoja de Google Sheets que acabamos de crear en este post.
¡No te pierdas este podcast!
Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.
Estamos comprometidos.
Tecnología, personas e impacto positivo.
Cuéntanos qué te parece.