chaoss / grimoirelab

GrimoireLab: platform for software development analytics and insights
https://chaoss.github.io/grimoirelab/
GNU General Public License v3.0
470 stars 179 forks source link

GSoC Idea: Boosting data processing in GrimoireLab #285

Closed valeriocos closed 4 years ago

valeriocos commented 4 years ago

GrimoireLab allows to produce analytics with data extracted from more than 30 tools used for contributing to Open Source development such as version control systems, issue trackers and forums. A common execution of GrimoireLab consists in collecting data from a given repository, processing and enriching the data obtained and finally visualizing it on dynamic Web dashboards. At the core of this process there is a component called ELK, which is in charge of integrating the data finally shown on the dashboards.

The evolution of GrimoireLab requires now to reshape some of the functionalities provided by ELK to improve its maintainability. This project idea is about refactoring and redesigning the core of ELK using popular libraries for data management and processing such as elasticsearch-py and pandas.

The aims of the project are as follows:

The aims will require working with Python, ELK and the ElasticSearch database.

Microtasks

For becoming familiar with GrimoireLab, you can start by reading some documentation. You can find useful information at:

Once you're familiar with Grimoirelab, you can have a look at the following microtasks.

snack0verflow commented 4 years ago

Hello mentors! I am Abid Abdullah a CS undergrad at BITS-Hyderabad. I am going through the microtasks now. I have college and industrial experience in python and pandas. I would like to work on this project and had a few queries:

valeriocos commented 4 years ago

Hi @snack0verflow, it's great that you want to work on this idea! Thanks

The IRC channel is #grimoirelab at Freenode, you can find more details here. I would suggest to use issues as first option to engage conversations with the community. Thus, everybody will benefit of the discussions.

No, however note that Microtask 9 and 10 are quite open, so you can use them to work on whatever you like. If you have ideas in mind, we can brainstorm on them and see how to convert them to pull requests.

snack0verflow commented 4 years ago

@valeriocos I want to increase the code coverage of some tests at https://github.com/chaoss/grimoirelab-elk/tree/master/grimoire_elk/enriched Is there any tool/dataset that can get me file-wise code coverage of these tests so I can easily target what test files to work on? I couldn't find you on #grimoirelab channel on IRC(Freenode) so I asked my query here.

snack0verflow commented 4 years ago

One more query: Is docker required for running SirMordred? The pycharm part of the documentaion at https://github.com/chaoss/grimoirelab-sirmordred#setting-up-a-pycharm-dev-environment ,isn't clear. The last image doesn't show the parameters field entirely.

valeriocos commented 4 years ago

Hi @snack0verflow , find below the answer for https://github.com/chaoss/grimoirelab/issues/285#issuecomment-586558634

If you want to execute mordred with docker, you should follow the instructions at https://github.com/chaoss/grimoirelab#using-docker-run. However in this case, you won't be able to easily use the latest changes in the master branches of the grimoirelab repos (or test your changes).

The instructions at https://github.com/chaoss/grimoirelab-sirmordred#source-code-and-docker rely on a docker compose containing elasticsearch, kibiter and optionally mariadb. Once you have the containers running, you can fork the grimoirelab repos as documented at: https://github.com/chaoss/grimoirelab-sirmordred#setting-up-a-pycharm-dev-environment. Then, you can execute micro-mordred (details at: https://github.com/chaoss/grimoirelab-sirmordred#micro-mordred) on the master branches or on your branches [+].

The pycharm part of the documentaion at https://github.com/chaoss/grimoirelab-sirmordred#setting-up-a-pycharm-dev-environment ,isn't clear. The last image doesn't show the parameters field entirely.

The parameters you see there are the ones for micro-mordred, examples of such params are at the end of the section https://github.com/chaoss/grimoirelab-sirmordred#micro-mordred

[+] To test your branches, you have just to access the local copy of the repo you want to modify, do a git checkout to a new branch, apply your changes and execute micro-mordred on that new branch.

Don't hesitate to write if something isn't clear.

valeriocos commented 4 years ago

@snack0verflow find below the answer for https://github.com/chaoss/grimoirelab/issues/285#issuecomment-586555523.

Nice catch! The doc misses this info, I'm going to upload a PR to the ELK repo with the details to run the tests and coverage. I'll ping you soon, thanks

snack0verflow commented 4 years ago

@valeriocos Let me rephrase my question about docker: Is it possible to execute mordred without docker?

valeriocos commented 4 years ago

Yes, you can! Mordred can be executed in the following ways:

Does it answer your question @snack0verflow? Why you don't want to use docker?

snack0verflow commented 4 years ago

Thanks for the comprehensive answer @valeriocos ! The second method looks efficient. I was a bit apprehensive about it because I haven't tried containerization before. Now that you mention, I will surely check it out.

valeriocos commented 4 years ago

you're welcome @snack0verflow

snack0verflow commented 4 years ago

@valeriocos I have set up a dev environment in Pycharm by opening the project ~/sources/grimoirelab-sirmordered but when I run ~/sources/grimoirelab-sirmordred/utils$ python3 micro.py --raw --enrich --cfg ./setup.cfg --backends git cocom I get the following error:

Traceback (most recent call last): File "micro.py", line 27, in from sirmordred.config import Config ModuleNotFoundError: No module named 'sirmordred'

I have forked and cloned https://github.com/chaoss/grimoirelab-sirmordred into ~/sources/grimoirelab-sirmordred/. Is this okay or the directory should be called ~/sources/sirmordred/?

I have installed all the requirements as mentioned in ~/sources/grimoirelab-sirmordred/requirements.txt except grimoirelab ones. For grimoirelab dependencies I added the forked/cloned repos(already present in ~/sources/) to the project structure as mentioned in https://github.com/chaoss/grimoirelab-sirmordred#setting-up-a-pycharm-dev-environment

EDIT: It worked after creating a pycharm configuration but not working from pycharm terminal. Something to do with PYTHONPATH?

snack0verflow commented 4 years ago

@valeriocos I am facing two issues right now:

Retrying (Retry(total=20, connect=21, read=8, redirect=5, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:852)'),)': /

Traceback (most recent call last): File "/home/abid/sources/grimoirelab-sirmordred/utils/micro.py", line 220, in args.panels) File "/home/abid/sources/grimoirelab-sirmordred/utils/micro.py", line 52, in micro_mordred config = Config(cfg_path) File "/home/abid/sources/grimoirelab-sirmordred/sirmordred/config.py", line 60, in init self.read_conf_files() File "/home/abid/sources/grimoirelab-sirmordred/sirmordred/config.py", line 704, in read_conf_files self.check_config(self.conf) File "/home/abid/sources/grimoirelab-sirmordred/sirmordred/config.py", line 612, in check_config raise RuntimeError("Wrong section param:", section, param) RuntimeError: ('Wrong section param:', 'sortinghat', 'bots_names')

valeriocos commented 4 years ago

@snack0verflow thanks for your interested in GrimoireLab!

I ran docker-compose with the docker-compose.yml specified in ...

The docker-compose there is using a secured connection, please try to connect to:

Let me know if this solves your issue

The setup.cfg in https://github.com/chaoss/grimoirelab-sirmordred/tree/ma...

Can you submit a PR to sirmordred. The fix should remove lines 57 and 58 of the https://github.com/chaoss/grimoirelab-sirmordred/blob/master/utils/setup.cfg?

Thanks

snack0verflow commented 4 years ago

@valeriocos At some point I installed mariadb https://chaoss.github.io/grimoirelab-tutorial/basics/supporting.html#installing-mariadb after which docker compose stopped working:

Creating docker-containers_mariadb_1 ... error ERROR: for docker-containers_mariadb_1 Cannot start service mariadb: driver failed programming external connectivity on endpoint docker-containers_mariadb_1 (01f169060b50956fe61d0b3f8c570659bdc9065b91eee3bc0b0bab0c25a08f83): Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: addresCreating docker-containers_elasticsearch_1 ... error WARNING: Host is already in use by another container

I then uninstalled mariadb like this https://askubuntu.com/a/806441 Now docker-compose is not showing error but neither kibiter nor elastisearch are working, with or without https.

Then I tried running everything without docker-compose installed everything, kibiter and elastisearch were running. But micro-mordred gave:

Retrying (Retry(total=20, connect=21, read=8, redirect=5, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:852)'),)': /

snack0verflow commented 4 years ago

Can you submit a PR to sirmordred. The fix should remove lines 57 and 58 of the https://github.com/chaoss/grimoirelab-sirmordred/blob/master/utils/setup.cfg?

@valeriocos I want to be sure that the problem is not with my setup. So I'll wait till I get the dependencies working.

valeriocos commented 4 years ago

https://github.com/chaoss/grimoirelab/issues/285#issuecomment-588394605

I'll be on IRC today, so we can have a look at this together

https://github.com/chaoss/grimoirelab/issues/285#issuecomment-588648419

As you prefer.

vchrombie commented 4 years ago

Hi @snack0verflow

Then I tried running everything without docker-compose installed everything, kibiter and elastisearch were running. But micro-mordred gave:

Retrying (Retry(total=20, connect=21, read=8, redirect=5, status=None)) after connection broken by 'SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:852)'),)': /

I am not sure about the exact reason, but please have a check with this. Make sure you have the same version of kibiter and elasticsearch.

I just saw in the #285 comment, that you installed elasticsearch (v7.6.0). It might give an error if the version of kibiter is not the same. Refer to this, in case of any doubt chaoss/grimoirelab-kibiter.

snack0verflow commented 4 years ago

@vchrombie I am sure the versions of kibana and elasticsearch are matched(both are 7.6.0). I have messed up my MySQL installation.

valeriocos commented 4 years ago

For all students interested in this idea, please comment on this issue to get in touch with the mentors. This is the main communication channel.

snack0verflow commented 4 years ago

@valeriocos I finally started with a fresh install of linux but I am not able to run elasticsearch/kibiter via docker-compose method. I have cloned the repos in ~/sources/grimoirelab-... and my yml file is at ~/Containers/docker-compose.yml. This is the console output:

~/Containers/$ sudo docker-compose up -d
Creating mordred_elasticsearch_1 ... done
Creating mordred_mariadb_1       ... done
Creating mordred_kibiter_1       ... done

Please help. Thanks :)

valeriocos commented 4 years ago

That's a good news @snack0verflow ! Now you can use micro-mordred to start playing with the platform (https://github.com/chaoss/grimoirelab-sirmordred#micro-mordred). Please have a look also at the sirmordred documentation (https://github.com/chaoss/grimoirelab-sirmordred#sirmordred-) to have a first understanding of the configuration files (i.e., setup.cfg and projects.json) used by the platform.

Please remember to submit a PR to remove lines 57 and 58 from https://github.com/chaoss/grimoirelab-sirmordred/blob/master/utils/setup.cfg

Thanks!

snack0verflow commented 4 years ago

@valeriocos maybe you misread my comment :smile_cat: I meant to say it is not working.

snack0verflow commented 4 years ago

When I run docker-compose for the first time, it is pulling the more recent versions of elasticsearch/kibiter which might cause version mismatch. Could you please check if it is working for you?

valeriocos commented 4 years ago

sorry @snack0verflow ! from the output you posted, I understood that you had something working.

I am not able to run elasticsearch/kibiter via docker-compose method

Do you have some logs or can you summarize why you cannot use the docker-compose?

Are you using the docker-compose at https://github.com/chaoss/grimoirelab-sirmordred#source-code-and-docker ?

snack0verflow commented 4 years ago

@valeriocos I ran docker-compose without -d and got this and a bunch of other stuff.

Starting mordred_kibiter_1 ... done
Attaching to mordred_elasticsearch_1, mordred_mariadb_1, mordred_kibiter_1
kibiter_1        | error: ELASTICSEARCH_USER or/and ELASTICSEARCH_PASSWORD environment variables were not configured
kibiter_1        |   these two docker environment variables must be configured before running the container

Are you using the docker-compose at https://github.com/chaoss/grimoirelab-sirmordred#source-code-and-docker ?

Yes

snack0verflow commented 4 years ago

@valeriocos Here is the verbose output.

snack0verflow commented 4 years ago

@valeriocos I tried running docker-compose on other systems as well and I am running into the same problem :disappointed: . Could you please provide detailed steps on how to run docker-compose? Thanks :)

@valeriocos I ran docker-compose without -d and got this and a bunch of other stuff.

Starting mordred_kibiter_1 ... done
Attaching to mordred_elasticsearch_1, mordred_mariadb_1, mordred_kibiter_1
kibiter_1        | error: ELASTICSEARCH_USER or/and ELASTICSEARCH_PASSWORD environment variables were not configured
kibiter_1        |   these two docker environment variables must be configured before running the container
valeriocos commented 4 years ago

Thank you @snack0verflow for the logs!

I'm investigating the error error: ELASTICSEARCH_USER or/and ELASTICSEARCH_PASSWORD environment variables were not configured. I'm using the same docker-compose, but I've never seen this error.

In the logs I see the following:

[36melasticsearch_1  | [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

Please try to increase the virtual memory of ElasticSearch with this command (more info at here):

sysctl -w vm.max_map_count=262144
snack0verflow commented 4 years ago

@valeriocos elasticsearch is working on https://localhost:9200/ when I did sysctl -w vm.max_map_count=262144 but kibiter is still not working.

Syn3rman commented 4 years ago

@valeriocos @snack0verflow I was running into the same problem so I tried adding the username and password env variables to the docker compose file so that it now looks like:

elasticsearch:
  restart: on-failure:5
  image: bitergia/elasticsearch:6.1.0-secured
  command: elasticsearch -Enetwork.bind_host=0.0.0.0 -Ehttp.max_content_length=2000mb
  environment:
    - ES_JAVA_OPTS=-Xms2g -Xmx2g
  ports:
    - 9200:9200

kibiter:
  restart: on-failure:5
  image: bitergia/kibiter:secured-v6.1.4-5
  environment:
    - PROJECT_NAME=Development
    - NODE_OPTIONS=--max-old-space-size=1000
    - ELASTICSEARCH_URL=https://elasticsearch:9200/
    - ELASTICSEARCH_USER=elastic
    - ELASTICSEARCH_PASSWORD=changeme
  links:
    - elasticsearch
  ports:
    - 5601:5601

Kibiter still fails to connect to elasticsearch (though idk why since these are the default credentials) but it at least starts now.

snack0verflow commented 4 years ago

@Syn3rman Thanks a lot. Just setting the environment variables in the yml file worked for me. @valeriocos after I run micro-mordred from pycharm I get this on Kibana I hope its working fine: Screenshot from 2020-02-23 15-11-35

Syn3rman commented 4 years ago

I'm still getting Authentication finally failed for elastic. @snack0verflow could you confirm if you are using the same docker-compose file I've posted above? Thanks :)

snack0verflow commented 4 years ago

@Syn3rman No, I'm using the one specified at https://github.com/chaoss/grimoirelab-sirmordred#source-code-and-docker with the following two lines added to the kibiter environment:

- ELASTICSEARCH_USER=admin

  • ELASTICSEARCH_PASSWORD=admin
Syn3rman commented 4 years ago

@valeriocos Should I open a pr adding the two fields to the docker file? I think it would be a good place for me to start contributing (provided the change is needed :) )

valeriocos commented 4 years ago

Thank you @Syn3rman and @snack0verflow to spend time on the docker-compose issue! I'm trying to replicate this behavior on my machine, to confirm the problem. Once confirmed, I'll be absolutely happy if you can submit a PR :)

I did a docker system prune -a --volumes to remove all containers/images/volumens and I'm now trying a fresh installation

https://github.com/chaoss/grimoirelab/issues/285#issuecomment-590050229

The screenshot looks good, however the default index pattern isn't set. Which commands did you run with micro-mordred?

snack0verflow commented 4 years ago

@valeriocos I used these parameters

--raw --enrich --cfg ./setup.cfg --backends git cocom

I did not use --panels option

valeriocos commented 4 years ago

https://github.com/chaoss/grimoirelab/issues/285#issuecomment-590058570

Ok @snack0verflow , in this case the screenshot makes sense. Thanks for the quick reply. Did you have any problem to execute cocom?

snack0verflow commented 4 years ago

@valeriocos Not then, but now when I run with the same params I get this error:

 Error feeding raw from cocom (https://github.com/chaoss/grimoirelab-toolkit): [Errno 2] No such file or directory: 'cloc': 'cloc'
Traceback (most recent call last):
  File "/home/abid/sources/grimoirelab-elk/grimoire_elk/elk.py", line 228, in feed_backend
    ocean_backend.feed(**params)
  File "/home/abid/sources/grimoirelab-elk/grimoire_elk/raw/elastic.py", line 234, in feed
    self.feed_items(items)
  File "/home/abid/sources/grimoirelab-elk/grimoire_elk/raw/elastic.py", line 250, in feed_items
    for item in items:
  File "/home/abid/sources/grimoirelab-perceval/perceval/backend.py", line 221, in fetch
    for item in self.fetch_items(category, **kwargs):
  File "/home/abid/sources/grimoirelab-graal/graal/graal.py", line 192, in fetch_items
    raise e
  File "/home/abid/sources/grimoirelab-graal/graal/graal.py", line 185, in fetch_items
    commit['analysis'] = self._analyze(commit)
  File "/home/abid/sources/grimoirelab-graal/graal/backends/core/cocom.py", line 209, in _analyze
    file_info = self.analyzer.analyze(local_path)
  File "/home/abid/sources/grimoirelab-graal/graal/backends/core/cocom.py", line 269, in analyze
    cloc_analysis = self.cloc.analyze(**kwargs)
  File "/home/abid/sources/grimoirelab-graal/graal/backends/core/analyzers/cloc.py", line 121, in analyze
    message = subprocess.check_output(cloc_command).decode("utf-8")
  File "/usr/lib/python3.6/subprocess.py", line 356, in check_output
    **kwargs).stdout
  File "/usr/lib/python3.6/subprocess.py", line 423, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'cloc': 'cloc'
valeriocos commented 4 years ago

https://github.com/chaoss/grimoirelab/issues/285#issuecomment-590059323

@snack0verflow you need to install cloc, see here the steps: https://github.com/chaoss/grimoirelab-graal#how-to-installcreate-the-executables

snack0verflow commented 4 years ago

you need to install cloc, see here the steps: https://github.com/chaoss/grimoirelab-graal#how-to-installcreate-the-executables

@valeriocos Should this be mentioned in mordred readme?

Also I got this error while running micro-mordred now(and last time also when I got the cloc error):

2020-02-23 17:07:43,693 GET https://localhost:9200/git_chaoss/_search?scroll=300m&size=500 [status:400 request:0.005s] 2020-02-23 17:07:43,693 [git] Problem executing study enrich_areas_of_code:git, RequestError(400, 'search_phase_execution_exception', 'No mapping found for [metadata__timestamp] in order to sort on') 2020-02-23 17:07:43,693 RequestError(400, 'search_phase_execution_exception', 'No mapping found for [metadata__timestamp] in order to sort on')

After this kibiter shows only cocom_chaoss as an index.

valeriocos commented 4 years ago

@valeriocos Should this be mentioned in mordred readme?

Good idea @snack0verflow ! Could you add a section about cocom at https://github.com/chaoss/grimoirelab-sirmordred#supported-data-sources? The new section should be similar to the other ones, thus it should contain an example of setup.cfg and projects.json (you can take the example from https://github.com/chaoss/grimoirelab/tree/master/third-party#preparation). At the beginning of this section, you mention that some executables are needed and add a link to Graal.

WDYT?

Also I got this error while running micro-mordred now:

The error is due to the fact the index is empty. An index for git data can be empty when the local clone of the repository you are analyzing is in sync with the upstream repo, thus there are no new commits to ingest to grimoirelab. The solution is either

Find below some extra details to better understand this behavior.

The Git backend of perceval performs a clone of the repository and keeps the local copy in sync with the upstream one. This clone is then used to ingest the commits data to grimoirelab.

Grimoirelab periodically collects data from different data sources (in this specific case, a git repository) in an incremental way. A typical execution of grimoirelab for a git repository consists of ingesting only the new commits to the platform. These commits are obtained by comparing the local copy with the upstream one, thus if the two repos are syncronized no commits are returned. In case you want to extract all commits (even if you have already a local clone), you can disable the param latest-items. Anothe option is to delete the local clone (which is stored at ~/.perceval/repositories), thus the platform will clone the repo again and extract all commits.

Let me know if the explanation isn't clear or you need further clarifications.

valeriocos commented 4 years ago

@snack0verflow @Syn3rman I was able to replicate the problem you reported about the docker-compose (https://github.com/chaoss/grimoirelab/issues/285#issuecomment-589990729).

At very beginning I wasn't able to reproduce it because my docker compose was using a different image of kibiter (bitergia/kibiter:secured-v6.1.4-2), which didn't need the params ELASTICSEARCH_USER and ELASTICSEARCH_PASSWORD.

Since @snack0verflow will be probably prepare a PR for this: https://github.com/chaoss/grimoirelab/issues/285#issuecomment-590061923, @Syn3rman can you submit a PR to update the docker-compose at https://github.com/chaoss/grimoirelab-sirmordred#source-code-and-docker? You can rely on the info at https://github.com/chaoss/grimoirelab/blob/master/docker-compose/docker-compose-secured.yml#L34.

Thanks

snack0verflow commented 4 years ago

Thanks a lot @valeriocos. I will prepare a pull request for enhancing the readme with cocom info. Also, I would request @Syn3rman to make https://github.com/chaoss/grimoirelab-sirmordred#source-code-and-docker a little bit more descriptive to help newcomers. Thanks again :)

Syn3rman commented 4 years ago

Sorry for the hold-up, but I'll get right at it.

kshitij3199 commented 4 years ago

Hello Mentors, I am Kshitij Gupta, a CS undergraduate from BITS PILANI. I would love to work on this project, I have quite a good experience in Python and Pandas. I am starting off with the microtasks and I will update my progress here.

Polaris000 commented 4 years ago

@kshitij3199! Thanks for your interest in this idea. Let us know if you have any questions.

snack0verflow commented 4 years ago

@valeriocos I had a query, while enriching the raw indexes created by Perceval, how does ELK add additional data like Time to merge pull requests that are not available via Perceval? Specifically from where does this information come. I know about the SortingHat and Graal part but time to merge/close puzzles me.

valeriocos commented 4 years ago

This is done during the enrichment phase.

ELK feeds the Perceval items to elasticsearch using this function: https://github.com/chaoss/grimoirelab-elk/blob/master/grimoire_elk/elk.py#L49 (collection phase). Then, it reads from the raw indexes this data again and creates the enriched data using this function: https://github.com/chaoss/grimoirelab-elk/blob/master/grimoire_elk/elk.py#L410 (enrichment phase). ELK has an enricher for each data source. In the case of github, the enricher is https://github.com/chaoss/grimoirelab-elk/blob/master/grimoire_elk/enriched/github.py, and in particular the time to merge is added here: https://github.com/chaoss/grimoirelab-elk/blob/master/grimoire_elk/enriched/github.py#L511

Does the explanation above answer your question?

snack0verflow commented 4 years ago

@valeriocos Oh, It seems that time to merge is being calculated based on review comments by other users: https://github.com/chaoss/grimoirelab-elk/blob/13982d4024ffcaf2d0e42a26194ec4725619fed8/grimoire_elk/enriched/github.py#L181 But I think review comments can also ask for some changes by the creator of PR. It doesn't necessarily mean that the PR is being closed.(Please correct me if I am wrong)

snack0verflow commented 4 years ago

@valeriocos I also had a suggestion: When looking at the coverage report generated for ELK test routines, I found that the report is generated for the tests as well, for example:

run_tests.py    6      0   100%
test_askbot.py     50      4    92%   106-109
test_bugzilla.py    54      4    93%   112-115
test_bugzillarest.py    71      4    94%   143-146
test_cocom.py    99      4    96%   156-159
test_colic.py    88      4    95%   146-149
test_confluence.py     67      4    94%   133-136
test_crates.py    51      4    92%   114-117

To prevent this we can use the config files for exclusion as mentioned in https://coverage.readthedocs.io/en/coverage-5.0.3/excluding.html