Code Monkey home page Code Monkey logo

metrik's Introduction

All Contributors Issues Licnece

Backend test Frontend test codecov

Release

Maintained by SEA team, ThoughtWorks Inc.

Read this in other languages: English, 简体中文

Table of Contents

About the Project

For development teams who wants to measure their software delivery and operational (SDO) performance, this is a tool that helps them collect data from CD pipelines and visualize the key metrics in a friendly format.

The key differentiators:

  • One page configuration, quick and easy.
  • The ability to work across different CD platforms.
  • User can select the environment in which the analysis runs via a environment filter (Yes, production env is not the only one that matters)

Don't know what are those four key metrics?

Integration roadmap

List of CD tools the product supports now/plan to support

  • Jenkins

  • Bamboo

  • GitHub Actions

  • Buddy

  • CircleCI

    ...and more on the way

Usage

Follow the two steps below to run the tool, and measure the four key metrics of your projects.

Install and run

The product is released to a public repository hosted on Docker Hub docker.io/wszzwpshh1/metrik. Please follow the steps:

  1. Ensure Docker has already installed on your OS.
  2. Find available release versions in the release page.
    Or, you can find all history versions from our image repository
  3. Run the container locally via the following command:
docker run -d -p 80:80 --name metrik wszzwpshh1/metrik:latest

⚠️ We use port 80 to access the app. You may switch to any other port in case port 80 is occupied by other apps running on your machine.
⚠️ The latest tag matches the most recent version of this repository. Thus using wszzwpshh1/metrik:latest or wszzwpshh1/metrik will ensure you are running the most up to date version of this image.
If you want to stick to a specific version tag, remember there no "v" in version name. e.g. wszzwpshh1/metrik:latest: 1.6.5

Configure your projects

After the container is running on your machine. Go to your favourite browser and open the app. If running in local that would be http://localhost:80/.

  1. Start the configuration:
  1. And the charts for each key metric will be available at the main page:
  1. Also the full screen view if you want to put it on big screens:

Advanced usage

If you would like to keep the 4-key-metrics data to avoid losing any data when remove container, you can mount the database folder /data/db out. And logs are also available if you mount the log folder /app/logs. As shown in the example below:

docker run -d -p 80:80 --name metrik -v "/path/to/local/directory:/data/db" -v "/path/to/another/directory:/app/logs" wszzwpshh1/metrik:${release_version}

How to Compute, FAQs

See our Wiki page

Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.

Please check our contributing guideline form HERE

Getting Started

The codebase comprises of three major components frontend, backend, ci.

  • Frontend app is a web application built with:

    • TypeScript
    • ReactJS
    • ReCharts

    Go to frontend folder to find more details.

  • Backend app is built with:

    • Kotlin
    • Spring Boot Web
    • MongoDB

    Go to backend folder to find more details.

  • Build/Package scripts lives in ci folder

More

You might also like:

  • Buildvis, transparency for your build pipeline's results and runtime
  • HeartBeat, calculates delivery metrics from CI/CD build data, revision control and project planning tools.
  • GoCD Analytics Plugin, provides insights into your GoCD instance.

License

Distributed under the MIT License. See LICENSE for more information

Contributors ✨

Thanks goes to these wonderful people (emoji key):

Zhe ZHAO
Zhe ZHAO

💻
Hao Yang
Hao Yang

💻
Jason Zhang
Jason Zhang

🚇
橘子小睿
橘子小睿

💻
HUANG Binfang
HUANG Binfang

💻
HeZhuConnie
HeZhuConnie

💻
Mengqiu PENG
Mengqiu PENG

💻
Kiky
Kiky

💻
Rong
Rong

💻
Piaopiao-TW
Piaopiao-TW

💻
zydxt
zydxt

💻
ifeelcold1824
ifeelcold1824

💻
快乐心情
快乐心情

💻
Taiyu Guo
Taiyu Guo

💻
sasasakuna
sasasakuna

💻
Chen
Chen

💻
ivy-pugai
ivy-pugai

💻
ZengXiaoXing
ZengXiaoXing

💻
HeyWen
HeyWen

💻
yong-wang1
yong-wang1

💻
Paula Ferreira
Paula Ferreira

🚇
twpei
twpei

💻
Henning S.
Henning S.

💻
Prateek
Prateek

💻
Karuppiah Natarajan
Karuppiah Natarajan

💻
Fabio Formosa
Fabio Formosa

📖
Zhongwen Lian
Zhongwen Lian

💻
Devonzhang
Devonzhang

💻
Ashish Soni
Ashish Soni

💻
Marco Hutzsch
Marco Hutzsch

💻
Ikko Ashimine
Ikko Ashimine

📖
HE00L
HE00L

💻
ATPEEE
ATPEEE

💻
Sun Lixing
Sun Lixing

💻
RoujingLiu
RoujingLiu

💻
Ingridwyh090
Ingridwyh090

💻
xloypaypa
xloypaypa

💻
razu
razu

💻
Wildan S. Nahar
Wildan S. Nahar

💻

This project follows the all-contributors specification. Contributions of any kind welcome!

metrik's People

Contributors

allcontributors[bot] avatar binfang-huang avatar devonzhang avatar github-actions[bot] avatar hackl0us avatar he00l avatar heywen avatar hezhuconnie avatar hyrepo avatar ifeelcold1824 avatar ivy-pugai avatar ivy-zxx avatar kikychn avatar klxq avatar mengqiupeng avatar miyakee avatar paulaasf avatar piaopiao-tw avatar razubuddy avatar reeli avatar rongzhou1 avatar sasasakuna avatar sourav-tw avatar taiyu4linkt avatar twpei avatar wildan3105 avatar xloypaypa avatar yong-wang1 avatar zhe-zhao avatar zydxt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

metrik's Issues

Upgrade gradle to the latest version

Is your feature request related to a problem? Please describe.
As part of development workflow, we use gradle. I request and propose to use the latest stable version of gradle which is 6.8.3 as of this writing. Soon v7 is going to release too, this is to just be able to use the latest and greatest and not be stuck with old versions of development tools

Describe the solution you'd like
Upgrade the gradle version which is present as part of the gradle wrapper properties

API is failing while integrating the Metrick with Jenkins pipeline

Hi Team,

I have installed the Metrick and tried to connect with the Jenkins pipeline. When I have specified the URL of the pipeline it does not take. It is showing the error:
"jenkins.abc.com executing GET https://jenkins.abc.com/jenkins/job/OMS_Metrick/wfapi/."

As I have to debug this error. It is due that the GET method that Metrick is not taking it.
{"status":500,"message":"Request method 'GET' not supported"}

Please look into this issue. As i am trying for DevOps metrics.
@hyrepo Yang

Optimize the efficiency of Bamboo synchronization

Is your feature request related to a problem? Please describe.

The Bamboo synchronization is using the following steps:

  1. Call a Bamboo API to get the maximum build number
  2. For each build, call a Bamboo API to get build details and save it into DB

For step 2, currently we're using parallelStream and RestTemplate to send request parallelly, whose performance is limited by the number of CPU cores.

Therefore, when sync large amount builds (1000+), it may take several minutes to finish, which caused time out.

Describe the solution you'd like

  • Instead of using RestTemplate, WebClient could be considered, since it send requests asynchronous.
  • Kotlin coroutines also could be considered

Additional context

The Current solution is setting the keepalive_timeout in Nginx to 10 minutes, which is not an ideal long-term solution.

Should disable pipeline settings when sync build

Is your feature request related to a problem? Please describe.

When synchronization is in progress, the Pipeline Settings button is not disabled, so users could change pipeline settings, which will trigger another synchronization.

image

Describe the solution you'd like

Disabled the button when synchronization is in progress.

Add a structure diagram into contributing file

Describe the solution you'd like
Add a structure diagram to explain the data flow and components responsibility, so it will be easier for new contributors to understand the structure and add new features.

The back-end API boot is failing inside the container

Hey folks 👋

Instructions from the README to start the application don't work. The API boot is failing inside the container (see the logs on the "Additional context" section).

To Reproduce

Steps to reproduce the behavior:

  1. Run docker run -d -p 80:80 --name metrik public.ecr.aws/j2s5d3z8/4-key-metrics:latest
  2. Go to http://localhost:80/
  3. See the warning message on the top-right "Request failed with status code 502"

The browser's network inspector says the request to http://localhost/api/project is returning 502.

Expected behavior

Accordingly, with the README, after running the docker container, the application should be working at localhost:80.

Screenshots

image

image

Desktop

  • OS: macOS Big Sur 11.5.2 (chip Apple M1)
  • Docker: version 20.10.6, build 370c289

Additional context

Log files from the container:

These two seems the most relevant:

Other log files:

The NGINX configuration file says the API is running at port 9000 inside the container:

location /api/ {
  proxy_pass http://127.0.0.1:9000;

  # Extends timeout for data sync process
  # Should find a better way to sync data more efficiently
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
}

See nginx_release.conf

Checking the API availability inside the container:

~/dev❯ docker ps
CONTAINER ID   IMAGE                                          COMMAND         CREATED      STATUS          PORTS                                                    NAMES
04d9d373df97   public.ecr.aws/j2s5d3z8/4-key-metrics:latest   "supervisord"   4 days ago   Up 20 minutes   9000/tcp, 0.0.0.0:80->80/tcp, :::80->80/tcp, 27017/tcp   metrik

Requests to http://127.0.0.1:9000 are failing

~/dev❯ docker exec -it 04d /bin/bash
root@04d9d373df97:/# curl http://127.0.0.1:9000
curl: (7) Failed to connect to 127.0.0.1 port 9000: Connection refused

Only port 80 is open inside the container:

root@04d9d373df97:/# lsof -i -P -n | grep LISTEN
nginx    21 root    6u  IPv4  20693      0t0  TCP *:80 (LISTEN)

NGINX logs:

==> nginx/error.log <==
2021/09/23 06:42:45 [emerg] 35#35: io_setup() failed (38: Function not implemented)
2021/09/23 06:42:45 [emerg] 31#31: io_setup() failed (38: Function not implemented)
2021/09/23 06:42:45 [emerg] 37#37: io_setup() failed (38: Function not implemented)
2021/09/23 06:43:00 [error] 36#36: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: localhost, request: "GET /api/project HTTP/1.1", upstream: "http://127.0.0.1:9000/api/project", host: "localhost", referrer: "http://localhost/"
2021/09/23 06:43:53 [error] 36#36: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: localhost, request: "GET /api/project HTTP/1.1", upstream: "http://127.0.0.1:9000/api/project", host: "localhost", referrer: "http://localhost/"

==> nginx/access.log <==
172.17.0.1 - - [23/Sep/2021:06:53:23 +0000] "GET /api/project HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" "-"
172.17.0.1 - - [23/Sep/2021:06:53:54 +0000] "GET / HTTP/1.1" 200 539 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" "-"
172.17.0.1 - - [23/Sep/2021:06:53:54 +0000] "GET /api/project HTTP/1.1" 502 559 "http://localhost/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" "-"
172.17.0.1 - - [23/Sep/2021:06:53:54 +0000] "GET /favicon.svg HTTP/1.1" 200 562 "http://localhost/" "Mozilla/5.0

Application logs:

 ==> 4km-service-2021-09-19-1.log <==
    ... 194 more
Caused by: java.lang.ClassFormatError: Illegal class name "java/lang/Class[]" in class file org/springframework/data/mongodb/core/MongoTemplate$$EnhancerBySpringCGLIB$$59b863f0
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.System$2.defineClass(Unknown Source)
    at java.base/java.lang.invoke.MethodHandles$Lookup.defineClass(Unknown Source)
    at java.base/jdk.internal.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:509)
    ... 208 more

==> 4km-service.log <==
    ... 194 more
Caused by: java.lang.ClassFormatError: Illegal class name "java/lang/Class[]" in class file org/springframework/data/mongodb/core/MongoTemplate$$EnhancerBySpringCGLIB$$8461e687
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.System$2.defineClass(Unknown Source)
    at java.base/java.lang.invoke.MethodHandles$Lookup.defineClass(Unknown Source)
    at java.base/jdk.internal.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:509)
    ... 208 more

Local setup fails

Describe the bug
When following the Environment Setup for backend and running ./mongodb-setup/mongodb-for-local/setup-mongodb.sh the script fails.

chmod: ../config/keyfile.txt: No such file or directory
chmod: ../config/*.sh: No such file or directory
ERROR: .FileNotFoundError: [Errno 2] No such file or directory: './docker-compose-for-local.yml'

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'backend'
  2. Run. ./mongodb-setup/mongodb-for-local/setup-mongodb.sh
  3. See error

Expected behavior
Running docker compose and setup mongo.

Desktop (please complete the following information):

  • OS: macOS 11.2.3
  • zsh 5.8

SynchronizationException due to missing or null head_branch field in GitHub Actions JSON response during pipeline synchronization

Describe the bug
When synchronizing a GitHub Actions pipeline in the project, the synchronization process fails due to a DecodeException caused by a missing or null head_branch value in the JSON response. The synchronization attempt leads to a SynchronizationException.

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'Project Synchronization Page'.
  2. Click on 'Start Synchronization' for the GitHub Actions pipeline.
  3. Observe the error message in the logs indicating a DecodeException due to the missing head_branch field.

Expected behavior
The synchronization should complete successfully without any errors, fetching all relevant data from the GitHub Actions pipeline.

Desktop (please complete the following information):

  • OS: MacOS
  • Browser: Chrome
  • Version: 125

Additional context
The synchronization error occurs specifically due to a missing head_branch field in the response data. This field is required but is currently null or missing in the GitHub API response, leading to a decoding failure when processing the pipeline runs.

INFO 2024-05-06 23:47:27.960 traceId: --- [pool-186-thread-1] m.p.r.a.SynchronizationApplicationService:Started synchronization for project [example-project-id]
INFO 2024-05-06 23:47:27.965 traceId: --- [pool-186-thread-1] m.p.d.r.ProjectRepository:Query result project ID [example-project-id] is [Project(id=example-project-id, name=example-project-name, synchronizationTimestamp=1714998475516)]
INFO 2024-05-06 23:47:27.968 traceId: --- [pool-186-thread-1] m.p.d.r.PipelineRepository:Query result size for pipeline with project ID [example-project-id] is [1]
INFO 2024-05-06 23:47:27.968 traceId: --- [pool-186-thread-1] m.p.r.a.SynchronizationApplicationService:Synchronizing [1] pipelines under project [example-project-id]
INFO 2024-05-06 23:47:27.968 traceId: --- [pool-186-thread-1] m.p.d.s.g.GithubActionsPipelineService:Started data sync for Github Actions pipeline [name: example-pipeline-name, url: https://api.github.com/repos/example-org/example-repo]
INFO 2024-05-06 23:47:27.970 traceId: --- [pool-186-thread-1] m.p.d.s.g.RunService:Get Github Runs - Sending request to Github Feign Client with url: https://api.github.com/repos/example-org/example-repo, pageIndex: 1
ERROR 2024-05-06 23:47:59.744 traceId: --- [pool-186-thread-1] m.p.r.a.SynchronizationApplicationService:Synchronize failed for pipeline [example-pipeline-id - example-pipeline-name], error: [feign.codec.DecodeException: Error while extracting response for type [class metrik.project.infrastructure.github.feign.response.MultipleRunResponse] and content type [application/json;charset=utf-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Instantiation of [simple type, class metrik.project.infrastructure.github.feign.response.SingleRunResponse] value failed for JSON property head_branch due to missing (therefore NULL) value for creator parameter headBranch which is a non-nullable type; nested exception is com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException: Instantiation of [simple type, class metrik.project.infrastructure.github.feign.response.SingleRunResponse] value failed for JSON property head_branch due to missing (therefore NULL) value for creator parameter headBranch which is a non-nullable type
 at [Source: (PushbackInputStream); line: 1, column: 646871] (through reference chain: metrik.project.infrastructure.github.feign.response.MultipleRunResponse["workflow_runs"]->java.util.ArrayList[50]->metrik.project.infrastructure.github.feign.response.SingleRunResponse["head_branch"])]
ERROR 2024-05-06 23:47:59.768 traceId:cc7efafa915d276f --- [http-nio-9000-exec-3] m.e.GlobalExceptionHandler:Unexpected exception happened with error message: Synchronize failed
metrik.project.exception.SynchronizationException: Synchronize failed
	at metrik.project.rest.applicationservice.SynchronizationApplicationService.synchronize$lambda-0(SynchronizationApplicationService.kt:42)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.base/java.util.stream.ForEachOps$ForEachTask.compute(Unknown Source)
	at java.base/java.util.concurrent.CountedCompleter.exec(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinTask.doInvoke(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinTask.invoke(Unknown Source)
	at java.base.java.util.stream.ForEachOps$ForEachOp.evaluateParallel(Unknown Source)
	at java.base.java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(Unknown Source)
	at java.base.java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.base.java.util.stream.ReferencePipeline.forEach(Unknown Source)
	at java.base.java.util.stream.ReferencePipeline$Head.forEach(Unknown Source)
	at metrik.project.rest.applicationservice.SynchronizationApplicationService.synchronize(SynchronizationApplicationService.kt:34)

4km dashboard charts beats quickly on Firefox

Moving from Trello

Describe the bug
As shown in the screen recording, the chart section flashes quickly on Firefox.

To Reproduce
@gtycherry Can help to add more?

Expected behavior
Should display charts normal as in Chrome

Screenshots

Screen_Recording_2021-03-17_at_11 06 56_AM

Desktop (please complete the following information):

  • Browser [Firefox]
  • Version [1.1.6]

Optimize local environment set up doc

Is your feature request related to a problem? Please describe.
It's not easy for new contributors to know how to set up a local environment for the first time.

Describe the solution you'd like
Add or optimize an existing doc to make it easier to understand.

Repository with more than 30 branches yielding wrong results

Describe the bug
When a repository has more than 30 branches, the app is fetching only 30 branches and filtering the runs within those branches. So any run happening on other branches are completely ignored.

To Reproduce
Steps to reproduce the behavior:

  1. Create a repo
  2. Create more than 30 branches
  3. Create action for only one branch (say master/main)
  4. Many of the times, that action will not show up

Expected behavior
All the actions should show up irrespective of the no of branches present in the repo

Migrate CI/CD to GitHub Actions

  • CircleCI is not secure enough, developers can use SSH login to the container environment to check private keys/credentials
  • CircleCI only supports one YAML file, if there are too many workflows inside, the YAML file would be too long to read.
  • CircleCI needs an extra token to checkout code base
  • CircleCI is a third-party service
  • The spec of CircleCI distributed VM is much lower than GitHub Actions'.

Synchronize failed while fetching commits of deleted branch in Github

Describe the bug
Synchronize failed while fetching commits of deleted branch in Github

To Reproduce
Steps to reproduce the behavior:

  1. Add a Github Actions project in which a branch is deleted after merging its commits
  2. See error

Expected behavior
Synchronize should work and able to see metrics

Desktop (please complete the following information):

  • OS: MAC
  • Browser: chrome
  • Version: HEAD

Error thrown
ERROR 2022-05-15 09:36:11.299 traceId: --- [pool-2-thread-1] m.p.r.a.SynchronizationApplicationService:Synchronize failed for pipeline [627ff5a82a30707ac0e4ed11 - ordermanagement], error: [feign.codec.DecodeException: Error while extracting response for type [java.util.List<metrik.project.infrastructure.github.feign.response.CommitResponse>] and content type [application/json;charset=utf-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of java.util.ArrayList<metrik.project.infrastructure.github.feign.response.CommitResponse> out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.util.ArrayList<metrik.project.infrastructure.github.feign.response.CommitResponse> out of START_OBJECT token
at [Source: (PushbackInputStream); line: 1, column: 1]]
Exception in thread "pool-2-thread-1" metrik.project.exception.SynchronizationException: Synchronize failed
at metrik.project.rest.applicationservice.SynchronizationApplicationService$synchronize$1.accept(SynchronizationApplicationService.kt:39)
at metrik.project.rest.applicationservice.SynchronizationApplicationService$synchronize$1.accept(SynchronizationApplicationService.kt:14)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
at java.base/java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:408)
at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:736)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:661)
at metrik.project.rest.applicationservice.SynchronizationApplicationService.synchronize(SynchronizationApplicationService.kt:34)
at metrik.project.rest.applicationservice.SynchronizationApplicationService$$FastClassBySpringCGLIB$$e40c75eb.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687)
at metrik.project.rest.applicationservice.SynchronizationApplicationService$$EnhancerBySpringCGLIB$$ff0f05fc.synchronize()
at metrik.project.rest.SynchronizationController$sseSynchronization$1.run(SynchronizationController.kt:53)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)

Integrating four key metrics to codefresh CI/CD tool

We'll be migrating from Jenkins to Codefresh CI/CD tool.
We want to include four key metrics as part of our CI/CD flow.

Due to some restrictions from client we can't use Go CI/CD, and metrik tool doesn't support integration with codefresh as per the README.md.

Any other alternative tool that you would recommend to capture four key metrics for Codefresh CI/CD?

Question: How is lead time for change is calculated?

Hello

I started experimenting with metrik and wanted to ask you how lead time for changes metrik is calculated. In the last 18 days, I had 3 deployments to production in my GitHub organization. When I adjusted the dates in the metrik ui to cover those periods and set the workflow name to the production deployment workflow, I see the following charts. How can the lead time to change metric in the last 20 days be equal to 88 days? Any help is appreciated.

image
image

Change the position of "Go to Dashboard" button

Is your feature request related to a problem? Please describe.

When users use this system for the first time, after they create the first pipeline, this page will be displayed. We found it's hard for them to notice the "Go to Dashboard" button, because they usually focus on the middle of the screen.

image

Describe the solution you'd like

Move this button to the middle

[Github Actions] Make workflow configurable in pipeline config

Describe the context of this enhancement
Currently for Github Actions project, by default for backend it will fetch all workflow for the repo. However in some cases not all workflow are meaningful and never be cared to visualize (e.g. scanning, specific testing, spiking ,etc.). If we could exclude these unimportant workflows, we could speed up the data sync as well as reduce some potential issue may have due to them.

Describe the solution you'd like
Enable workflow configuration in the pipeline config.

Task 1: Specify workflows when create Github Actions pipeline

  • (FE) Enhance the pipeline config UI with a section below Personal Access Token
  • (FE) Once user clicks Verify button and verify successfully, a workflow API is also triggered to visualize the list of existing workflows
  • (FE) User is able to select the workflows that they are interested in
  • (BE) createPipeline(POST /project/{projectId}/pipeline) API accepts the additional configuration about workflow selections and store into DB

Task 2: Update workflows when configure Github Actions pipeline

  • (FE) Display workflow config once Pipeline config popup is triggered, and initially fetch the latest workflow list
  • (FE) User is able to update the workflow select and make an update
  • (FE) Once URL/Personal Access Token is updated, the "Verify" triggering will update the workflow list accordingly
  • (BE) getPipeline (GET /project/{projectId}/pipeline/{pipelineId}) API returns the additional configuration about workflow selections from DB
  • (BE) updatePipeline (PUT /project/{projectId}/pipeline/{pipelineId}) API accepts the additional configuration about workflow selections and store into DB

Task 3: Sync data with only configured workflows

  • (BE) Replace querying all runs to query only the configured workflows' run by the workflow run API
  • (BE) For compatibility, if workflows are not configured yet when the sync is triggered, keep to query all runs

Additional context
The config of workflow need to store both workflow name and workflow id.

UI position for the new config:
image

Add contributors into README

Is your feature request related to a problem? Please describe.
We've migrated this repo between various organizations many times, somehow we lost contributes' information, the GitHub right panel of the project home page only shows 7 contributors, however, there are more than 20

Describe the solution you'd like
Use all-contributors bot to add all contributors

Model and collection renaming for better readability

Describe the context of this enhancement
At the beginning of this project, we choose Jenkins to integrate first, therefore, we used Jenkins as a reference when naming models and collection, which is not easy to understand when integrating with new CI/CD systems(e.g. Github Actions)

Describe the solution you'd like
Rename models and collections to more generic names.

One possible solution:

Pipeline -> PipelineConfiguration
Build -> Execution
Stage -> Phase

Update project name results to unnecessary quotation marks due to lack of payload validation (only using raw string)

Describe the context of this enhancement
Currently, it's accepting the raw body as the payload when updating the project name. This results in unnecessary quotation marks (i.e. \"Foundation team\") stored in the database when updating the project name from the UI.

Describe the solution you'd like
Let's change the payload to only accept JSON (in the backend) as well as change how UI sends request accordingly so we have consistent, clean, and structured data both in the frontend and backend. This is also consistent on how we accept JSON body when creating project.

I can help to fix this if necessary, just let me know what your opinion on this 😄

Add Four Key Metrics understanding and calculation logic in README

Is your feature request related to a problem? Please describe.
I believe Four Key Metrics only defines the results. However, we can use different data to show the status and results. For example, the Mean Time to Restore Service in the DORA report means "For the primary application or service you work on, how long does it generally take to restore service when a service incident or a defect that impacts users occurs(e.g., unplanned outage or service impairment)". After checking the code, I just found the MTTR metrics here is trying to focus on the Pipeline Stages.

So maybe we can have a clear clarification on README about our understanding on 4KM and calculation logic instead of just put the 4KM link in README?

Describe the solution you'd like
Maybe a clear clarification on our 4KM and calculation logic on README or video description will be better.

Additional context
I am not sure if we have checked Google's 4KM projects: https://github.com/GoogleCloudPlatform/fourkeys

Out of range of int when parsing github actions run id

Hello!

I've been trying to use metrik with github actions, but I am having an issue when configuring a pipeline. After adding the Repository Name, URL and Personal Access Token, when verifying I get the following error:

Error while extracting response for type [class metrik.product.infrastructure.github.feign.response.MultipleRunResponse] and content type [application/json;charset=utf-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Numeric value (2226315253) out of range of int (-2147483648 - 2147483647); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Numeric value (2226315253) out of range of int (-2147483648 - 2147483647) at [Source: (PushbackInputStream); line: 1, column: 51] (through reference chain: metrik.product.infrastructure.github.feign.response.MultipleRunResponse["workflow_runs"]->java.util.ArrayList[0]->metrik.product.infrastructure.github.feign.response.SingleRunResponse["id"])

The selected "Pipeline/Stage" group should remain closed when option in other groups are selected.

Moving from Trello

The issue and how to reproduce

  1. I select one, or more option in the Pipeline/Stage list
  2. Collapse the selected group
  3. Expand another group and select an option
  4. Every group that has an option already selected will expand automatically, which is not expect by user.

Expected behavior
Collapsed groups should remain their status when options under other groups are selected.

Screenshots
alt text

Desktop (please complete the following information):

  • Browser: Chrome, Safari
  • Version [1.1.6]

Integrating metrik into a real-world project

Describe the context of this enhancement
This request relates to documentation and the ability to guide a user on how to integrate metrik in an existing application. As a technical lead, I would like to integrate metrik with a real-world full-stack application, however, I don't have enough documentation showing how to do it.

Describe the solution you'd like
Ideally the solution shall provide an example with a full-stack application with GitHub as the source control and any cloud provider such as AWS. The documentation shall show how to integrate with metrik and provide examples show the various metrics such as deployment frequency, lead time etc.

Additional context
The idea would be to build up something similar to the Cypress Real World app https://github.com/cypress-io/cypress-realworld-app which in that case provides examples on how to integrate with different auth providers.

Unable to see the metrics for Jenkins project

Describe the bug
A clear and concise description of what the bug is.
I am able to integrate the tool with Jenkins pipeline. However when I go to dashboard, I get an error "Handler dispatch failed; nested exception is kotlin.NotImplementedError: An operation is not implemented: Not yet implemented".

Expected behavior
Expected to see the metrics data

Screenshots
Screenshot 2021-05-06 at 3 37 40 PM

Desktop (please complete the following information):

  • OS: Mac Big Sur
  • Browser Brave
  • Version 1.23.75

generate prometheus compatible metrics

Is your feature request related to a problem? Please describe.
Prometheus is the tool joining different sources of metrics in my company. We have built dashboards covering a broad range of services and right now we miss some way to get metrics from pipelines. Your project is amazing but we don't want to use other tool than grafana to visualize and manage dashboards.

Describe the solution you'd like
I didn't find in your docs any reference to integration with Prometheus. I would like to consume your tools as a prometheus exporter, producing metrics in the path '/metrics'

Describe alternatives you've considered
I discovered this tool and haven't tested this. To get metrics of pipelines into Prometheus, I tried to setup this exporter but until the moment I had no success to make it run.

Additional context
I work with gitlab, github and jenkins. Gitlab isn't in your roadmap according to your README, but this feature would benefit me in github and jenkins management.

Optimize progress notification

Describe the context of this enhancement
For some CI/CD systems, i.e. Github Actions, the synchronization has two parts: sync pipeline executions and sync commit history, both of them cost much time. The current implementation of progress notification can't handle a situation like this.

Describe the solution you'd like
Use segmented progress, e.g. 50% for executions sync and 50% for commit sync

Plans for Azure Pipelines intergration

Is your feature request related to a problem? Please describe.
Azure is a popular CI provider with Azure Pipelines. This would be a high value integration.

Has this integration been investigated and if so is this open to work on?

Log4j - Vulnerability Fix

Hello Team,

With the recent Log4j vulnerability, we have found that the current release of the docker image for Dora Metrics has issues.

Are we planning to update the docker images with the latest upgrade(log4j)/ fix for the issue.

Many thanks,
Mohammed

Out of range of int when parsing github actions run id

Describe the bug
Hello! I've been trying to use metrik with github actions, but I am having an issue when configuring a pipeline. After adding the Repository Name, URL and Personal Access Token, when verifying I get the following error:

{"status":500,"message":"Error while extracting response for type [class metrik.project.infrastructure.github.feign.response.MultipleRunResponse] and content type [application/json;charset=utf-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Numeric value (2167882875) out of range of int (-2147483648 - 2147483647); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Numeric value (2167882875) out of range of int (-2147483648 - 2147483647)\n at [Source: (PushbackInputStream); line: 1, column: 53] (through reference chain: metrik.project.infrastructure.github.feign.response.MultipleRunResponse[\"workflow_runs\"]->java.util.ArrayList[0]->metrik.project.infrastructure.github.feign.response.SingleRunResponse[\"id\"])"}

I tried a curl to the /actions/runs endpoint and I can see that in workflow_runs, the ids of the different runs are higher than 2147483647

Screenshots
Screenshot 2022-04-26 at 12 18 45

This is part of the result I get from the /actions/runs endpoint:
Screenshot 2022-04-26 at 12 37 40

npm audit: Vulnerabilities found ⚠️

Describe the bug
npm audit says that there are some vulnerabilities in the front end app that need to be fixed and can be fixed

To Reproduce
Steps to reproduce the behavior:

  1. Go to the git repository
  2. cd frontend
  3. npm audit
  4. See error
$ npm audit 
# npm audit report

yargs-parser  <=13.1.1 || 14.0.0 - 15.0.0 || 16.0.0 - 18.1.1
Prototype Pollution - https://npmjs.com/advisories/1500
fix available via `npm audit fix --force`
Will install [email protected], which is a breaking change
node_modules/stylelint-config-rational-order/node_modules/yargs-parser
  meow  5.0.0 - 6.0.1
  Depends on vulnerable versions of yargs-parser
  node_modules/stylelint-config-rational-order/node_modules/meow
    stylelint  9.2.1 - 12.0.1
    Depends on vulnerable versions of meow
    node_modules/stylelint-config-rational-order/node_modules/stylelint
      stylelint-config-rational-order  >=0.1.0
      Depends on vulnerable versions of stylelint
      node_modules/stylelint-config-rational-order

4 low severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Expected behavior
No vulnerabilities in the front end app

Extra information

Replace RestTemplate with FeignClient

Is your feature request related to a problem? Please describe.
Currently, we're using RestTemplate for API calls in backend to retrieve data from CI/CD systems, which caused many template codes.

Describe the solution you'd like
Replace RestTemplate with FeignClient in backend, so we can reduce code for API calls.

Need to integrate with GitHubActions

The tool is supposed to support Github Actions

Describe the solution you'd like

  1. Create, save and verify pipeline configuration (about 3 point)
  2. Sync and save data (about 3 point)
  3. UI change for configuration page (about 1 point)

Additional context
Add any other context or screenshots about the feature request here.

When using persistent volume (Azure File Share/ Azure Disk) on AKS Cluster, the application failed to read the Git hub data.

Hello Awesome Team,

Describe the bug

When using persistent volume (Azure File Share/ Azure Disk) on AKS Cluster,
the application failed to read the Git hub data, it kept on synchronizing but never loaded any data.

However if we deploy the application on AKS, with out any external volume mount, it works fine.

To Reproduce

SetUp

  1. Create a Storage class (Azure File Share) on AKS Cluster

  2. Create a PVC (Persistent Volume Claim)

  3. Create a deployment and mount the /data/db on the above created PVC

  4. Create a load balancer service for accessing the application.

  5. Access the application using load balancer IP,

  6. Create a new project and configure with GITHUB repo using PAT tokens.

Expected behavior

The application would have loaded the GITHUB data and display the charts.

Screenshots

image

image

Cluster Information

K8s Version : 1.20.7
Cloud Provider : Azure
Persistent Volume : Azure File Share / Azure Disk

Credentials exposed in getProjectDetails api

Describe the bug
Credentials exposed in getProjectDetails api, this may lead to a security issue.

To Reproduce
Steps to reproduce the behavior:

  1. open Chrom DevTools, go to Network tab
  2. Select one GET /api/project/XXXX
  3. Hit Preview, there is crendential info in the pipeline list

Expected behavior
Should hide crendential of the pipelines

Github BranchService only returns 1 page of results

val branches = with(githubFeignClient) {
getOwnerRepoFromUrl(pipeline.url).let { (owner, repo) ->
retrieveBranches(
pipeline.credential,
owner,
repo,
)
}
}

Github API Docs: https://docs.github.com/en/rest/branches/branches#list-branches
Based on the GH API, only the first 30 branches will be returned by the BranchService.

fun getNewRuns(pipeline: PipelineConfiguration, emitCb: (SyncProgress) -> Unit): MutableList<GithubActionsRun> {
val latestTimestamp = getLatestBuildTimeStamp(pipeline)
val newRuns = runService.syncRunsByPage(pipeline, latestTimestamp, emitCb)
val branches = branchService.retrieveBranches(pipeline)
return newRuns.filter { branches.contains(it.branch) } as MutableList<GithubActionsRun>
}

I'm not really sure why we're pulling the branches and filtering on them to begin with (if a run was executed on a specific branch, then that branch was later deleted, we'd still want to capture the run, right?), but if the branch filter is required (could someone reply with an explanation?), it might make sense to apply some pagination logic to the BranchService, similar to the logic used in syncRunsByPage:

https://github.com/thoughtworks/metrik/blob/main/backend/src/main/kotlin/metrik/project/domain/service/githubactions/RunService.kt#L19

How to build the docker image from this repository

Describe the context of this enhancement
Hi, I know there are several places that document the process of running the app locally (from backend, frontend, and ci folder). But I don't see there's a comprehensive step-by-step to build the app into a docker image and eventually run the app.

Describe the solution you'd like
A centralized content on how to build the app from scratch (backend & frontend) until the process of docker build and docker run so that we can run the app with ease without running the components (backend, frontend, DB) individually.

Additional context
So far, here's what I've done to build the app from scratch:

  • build the frontend app (by running npm run build:prod)
  • build the backend app (by running ./gradlew clean build)
  • collect artifacts (by following the steps here)
  • build the docker image by running docker build -t <docker-image-name>.
  • finally, run the container by running docker run -d -p 3000:80 --name <container-name> <docker-image-name>:latest

But the above method didn't work as the app has been returning 502 Bad Gateway. So I'd appreciate if there's any pointer on what went wrong from the above steps 🙇

Thank you very much!

Refactor API Test

Is your feature request related to a problem? Please describe.
Current API test is hard to understand and maintain.

Describe the solution you'd like
Change to another framework for API test, which is better to maintain

Unable to pull data for github actions project with 40 branches and over 11k commits

Describe the bug

  1. Start the container: docker run -d -p 80:80 --name metrik public.ecr.aws/j2s5d3z8/4-key-metrics:latest
  2. Configure a Github Action Pipeline for small project. Works
  3. Configure a Github Action Pipeline for project with lots of activity. Doesnt work

To Reproduce
I guess to reproduce just use a big project. The current project it is failing on has 40 branches and over 11k commits

Expected behavior
Show the data for big project

Desktop (please complete the following information):

  • OS: MacOS
  • Browser n/a
  • Version n/a

Additional context
Add any other context about the problem here.

INFO 2022-12-21 01:36:07.368 traceId: --- [pool-25-thread-1] m.p.d.s.g.CommitService:Get Github Commits - Sending request to Github Feign Client with owner: https://api.github.com/repos/ORG/REPO, since: 1970-01-01T08:00, until: 2022-12-20T23:46:41, branch: EPIC-XXX/OMITED, pageIndex: 79
ERROR 2022-12-21 01:36:07.485 traceId:a8d88d43711058d9 --- [http-nio-9000-exec-8] m.e.GlobalExceptionHandler:Unexpected exception happened with error message: null
org.springframework.web.context.request.async.AsyncRequestTimeoutException
	at org.springframework.web.context.request.async.TimeoutDeferredResultProcessingInterceptor.handleTimeout(TimeoutDeferredResultProcessingInterceptor.java:42)
	at org.springframework.web.context.request.async.DeferredResultInterceptorChain.triggerAfterTimeout(DeferredResultInterceptorChain.java:79)
	at org.springframework.web.context.request.async.WebAsyncManager.lambda$startDeferredResultProcessing$5(WebAsyncManager.java:438)
	at java.base/java.util.ArrayList.forEach(Unknown Source)
	at org.springframework.web.context.request.async.StandardServletAsyncWebRequest.onTimeout(StandardServletAsyncWebRequest.java:151)
	at org.apache.catalina.core.AsyncListenerWrapper.fireOnTimeout(AsyncListenerWrapper.java:44)
	at org.apache.catalina.core.AsyncContextImpl.timeout(AsyncContextImpl.java:136)
	at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:153)
	at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:241)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Unknown Source)
WARN 2022-12-21 01:36:07.486 traceId:a8d88d43711058d9 --- [http-nio-9000-exec-8] o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver:Failure in @ExceptionHandler metrik.exception.GlobalExceptionHandler#handleThrowable(Throwable)
org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class metrik.exception.ErrorResponse] with preset Content-Type 'text/event-stream'
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:299)
	at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:219)
	at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:124)
	at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:424)
	at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:75)
	at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:141)
	at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:80)
	at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1321)
	at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1132)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1078)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.cloud.sleuth.instrument.web.servlet.TracingFilter.doFilter(TracingFilter.java:68)
	at org.springframework.cloud.sleuth.autoconfig.instrument.web.LazyTracingFilter.doFilter(TraceWebServletConfiguration.java:121)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:103)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
	at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:633)
	at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:601)
	at org.apache.catalina.core.AsyncContextImpl$AsyncRunnable.run(AsyncContextImpl.java:586)
	at org.apache.catalina.core.AsyncContextImpl.doInternalDispatch(AsyncContextImpl.java:354)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.asyncDispatch(CoyoteAdapter.java:235)
	at org.apache.coyote.AbstractProcessor.dispatch(AbstractProcessor.java:241)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.base/java.lang.Thread.run(Unknown Source)
WARN 2022-12-21 01:36:07.486 traceId:a8d88d43711058d9 --- [http-nio-9000-exec-8] o.s.w.s.m.s.DefaultHandlerExceptionResolver:Async request timed out
WARN 2022-12-21 01:36:07.486 traceId:a8d88d43711058d9 --- [http-nio-9000-exec-8] o.s.w.s.m.s.DefaultHandlerExceptionResolver:Resolved [org.springframework.web.context.request.async.AsyncRequestTimeoutException]
INFO 2022-12-21 01:36:08.088 traceId: --- [pool-25-thread-1] m.p.d.s.g.CommitService:Get Github Commits - Sending request to Github Feign Client with owner: https://api.github.com/repos/ORG/REPO, since: 1970-01-01T08:00, until: 2022-12-20T23:46:41, branch: EPIC-XXXXX/OMITED, pageIndex: 80

After failing it will restart, successfully pull the information from the small repository then fail again on the big one.

Remove Git commit message

Is your feature request related to a problem? Please describe.
Currently, Metrik saves Git commit messages into the database. However, the four key metrics calculation is irrelevant with the Git message, the messages are unnecessary and expose some sensitive information.

Describe the solution you'd like
Remove Git commit message from the model and database.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.