SirMordred Build StatusCoverage Status

SirMordred is the tool used to coordinate the execution of the GrimoireLab platform, via two main configuration files, the setup.cfg and projects.json, which are summarized in their corresponding sections.

Contents

Setup.cfg

The setup file holds the configuration to arrange all process underlying GrimoireLab. It is composed of sections which allow to define the general settings such as which phases to activate (e.g., collection, enrichment) and where to store the logs, as well as the location and credentials for SortingHat and the ElasticSearch instances where the raw and enriched data is stored. Furthermore, it also includes backend sections to set up the parameters used by Perceval to access the software development tools (e.g., GitHub tokens, gerrit username) and fetch their data.

Dashboards can be automatically uploaded via the setup.cfg if the phase panels is enabled. The Data Status and Overview dashboards will contain widgets that summarize the information of the data sources declared in the setup.cfg. Note that the widgets are not updated when adding new data sources, thus you need to manually delete the dashboards Data Status and Overview, and restart mordred again (making sure that the option panels is enabled).

[es_collection]

[projects]

The template of a backend section is shown above. Further information about Perceval backends parameters are available at:

Note that some backend sections allow to specify specific enrichment options, which are listed below.

[jenkins]

[studies-name:tag] (tag is optional)

A template of a study section is shown above. A complete list of studies parameters is available at:

Projects.json

The projects.json aims at describing the repositories grouped by project that will be shown on the dashboards.

The project file enables the users to list the instances of the software development tools to analyse, such as local and remote Git repositories, the URLs of GitHub and GitLab issue trackers and the name of Slack channels. Furthermore, it also allows the users to organize these instances into nested groups, which structure is reflected in the visualization artifacts (i.e., documents and dashboards). Groups can be useful to represent projects within a single company, sub-projects within a large project such as Linux and Eclipse, or the organizations within a collaborative project.

  1. First level: project names
  2. Second level: data sources and metadata
  3. Third level: data source URLs

There are some filters, labels, and a special section:

Supported data sources

These are the data sources GrimoireLab supports: askbot, bugzilla, bugzillarest, cocom, colic, confluence, crates, discourse, dockerhub, dockerdeps, dockersmells, functest, gerrit, git, github, github2, gitlab, gitter, google_hits, groupsio, hyperkitty, jenkins, jira, kitsune, mattermost, mbox, mediawiki, meetup, mozillaclub, nntp, pagure, phabricator, pipermail, puppetforge, redmine, remo, rocketchat, rss, slack, stackexchange, supybot, telegram, twitter

askbot

Questions and answers from Askbot site

You have to add your public key in the gerrit server.

[enrich_demography:gerrit] (optional)

[enrich_onion:gerrit] (optional) in_index = gerrit_enriched out_index = gerrit-onion_enriched

#### git [↑](#supported-data-sources-)
Commits from Git

- projects.json

{ "Chaoss": { "git": [ "https:/github.com/chaoss/grimoirelab-perceval", "https:/github.com/chaoss/grimoirelab-sirmordred" ] } }

- setup.cfg

[git] raw_index = git_raw enriched_index = git_enriched latest-items = true (suggested) studies = [enrich_demography:git, enrich_git_branches:git, enrich_areas_of_code:git, enrich_onion:git, enrich_extra_data:git] (optional)

[enrich_demography:git] (optional)

[enrich_git_branches:git] (optional) run_month_days = [1, 23] (optional)

[enrich_areas_of_code:git] (optional) in_index = git_raw out_index = git-aoc_enriched

[enrich_onion:git] (optional) in_index = git_enriched out_index = git-onion_enriched

[enrich_extra_data:git] json_url = https://gist.githubusercontent.com/zhquan/bb48654bed8a835ab2ba9a149230b11a/raw/5eef38de508e0a99fa9772db8aef114042e82e47/bitergia-example.txt

[enrich_forecast_activity] out_index = git_study_forecast

#### github [↑](#supported-data-sources-)
Issues and PRs from GitHub

##### issue
- projects.json

{ "Chaoss": { "github:issue": [ "https:/github.com/chaoss/grimoirelab-perceval", "https:/github.com/chaoss/grimoirelab-sirmordred" ] } }

- setup.cfg

[github:issue] raw_index = github_raw enriched_index = github_enriched api-token = xxxx category = issue sleep-for-rate = true no-archive = true (suggested) studies = [enrich_onion:github, enrich_geolocation:user, enrich_geolocation:assignee, enrich_extra_data:github, enrich_backlog_analysis] (optional)

[enrich_onion:github] (optional) in_index_iss = github_issues_onion-src in_index_prs = github_prs_onion-src out_index_iss = github-issues-onion_enriched out_index_prs = github-prs-onion_enriched

[enrich_geolocation:user] (optional) location_field = user_location geolocation_field = user_geolocation

[enrich_geolocation:assignee] (optional) location_field = assignee_location geolocation_field = assignee_geolocation

[enrich_extra_data:github] json_url = https://gist.githubusercontent.com/zhquan/bb48654bed8a835ab2ba9a149230b11a/raw/5eef38de508e0a99fa9772db8aef114042e82e47/bitergia-example.txt

[enrich_backlog_analysis] out_index = github_enrich_backlog interval_days = 7 reduced_labels = [bug,enhancement] map_label = [others, bugs, enhancements]

##### pull request
- projects.json

{ "Chaoss": { "github:pull": [ "https:/github.com/chaoss/grimoirelab-perceval", "https:/github.com/chaoss/grimoirelab-sirmordred" ] } }

- setup.cfg

[github:pull] raw_index = github-pull_raw enriched_index = github-pull_enriched api-token = xxxx category = pull_request sleep-for-rate = true no-archive = true (suggested) studies = [enrich_geolocation:user, enrich_geolocation:assignee, enrich_extra_data:github] (optional)

[enrich_geolocation:user] location_field = user_location geolocation_field = user_geolocation

[enrich_geolocation:assignee] location_field = assignee_location geolocation_field = assignee_geolocation

[enrich_extra_data:github] json_url = https://gist.githubusercontent.com/zhquan/bb48654bed8a835ab2ba9a149230b11a/raw/5eef38de508e0a99fa9772db8aef114042e82e47/bitergia-example.txt

##### repo
The number of forks, starts, and subscribers in the repository.

- projects.json

{ "Chaoss": { "github:repo": [ "https:/github.com/chaoss/grimoirelab-perceval", "https:/github.com/chaoss/grimoirelab-sirmordred" ] } }

- setup.cfg

[github:repo] raw_index = github-repo_raw enriched_index = github-repo_enriched api-token = xxxx category = repository sleep-for-rate = true no-archive = true (suggested) studies = [enrich_extra_data:github]

[enrich_extra_data:github] json_url = https://gist.githubusercontent.com/zhquan/bb48654bed8a835ab2ba9a149230b11a/raw/5eef38de508e0a99fa9772db8aef114042e82e47/bitergia-example.txt

#### githubql [↑](#supported-data-sources-)
Events from GitHub

The corresponding dashboards can be automatically uploaded by setting `github-events`
to `true` in the `panels` section within the `setup.cfg`

- projects.json

{ "Chaoss": { "githubql": [ "https://github.com/chaoss/grimoirelab-toolkit" ] } }

- setup.cfg

[panels] github-events = true

[githubql] raw_index = github_event_raw enriched_index = github_event_enriched api-token = xxxxx sleep-for-rate = true sleep-time = "300" (optional) no-archive = true (suggested) studies = [enrich_duration_analysis:kanban]

[enrich_duration_analysis:kanban] start_event_type = MovedColumnsInProjectEvent fltr_attr = board_name target_attr = board_column fltr_event_types = [MovedColumnsInProjectEvent, AddedToProjectEvent]

[enrich_duration_analysis:label] start_event_type = UnlabeledEvent target_attr = label fltr_attr = label fltr_event_types = [LabeledEvent]


#### github2 [↑](#supported-data-sources-)
Comments from GitHub

The corresponding dashboards can be automatically uploaded by setting `github-comments`
to `true` in the `panels` section within the `setup.cfg`

##### issue
- projects.json

{ "Chaoss": { "github2:issue": [ "https:/github.com/chaoss/grimoirelab-perceval", "https:/github.com/chaoss/grimoirelab-sirmordred" ] } }

- setup.cfg

[github2:issue] api-token = xxxx raw_index = github2-issues_raw enriched_index = github2-issues_enriched sleep-for-rate = true category = issue no-archive = true (suggested) studies = [enrich_geolocation:user, enrich_geolocation:assignee, enrich_extra_data:github2, enrich_feelings] (optional)

[enrich_geolocation:user] (optional) location_field = user_location geolocation_field = user_geolocation

[enrich_geolocation:assignee] (optional) location_field = assignee_location geolocation_field = assignee_geolocation

[enrich_extra_data:github2] json_url = https://gist.githubusercontent.com/zhquan/bb48654bed8a835ab2ba9a149230b11a/raw/5eef38de508e0a99fa9772db8aef114042e82e47/bitergia-example.txt

[enrich_feelings] attributes = [title, body] nlp_rest_url = http://localhost:2901

##### pull request
- projects.json

{ "Chaoss": { "github2:pull": [ "https:/github.com/chaoss/grimoirelab-perceval", "https:/github.com/chaoss/grimoirelab-sirmordred" ] } }

- setup.cfg

[github2:pull] api-token = xxxx raw_index = github2-pull_raw enriched_index = github2-pull_enriched sleep-for-rate = true category = pull_request no-archive = true (suggested) studies = [enrich_geolocation:user, enrich_geolocation:assignee, enrich_extra_data:git, enrich_feelings] (optional)

[enrich_geolocation:user] (optional) location_field = user_location geolocation_field = user_geolocation

[enrich_geolocation:assignee] (optional) location_field = assignee_location geolocation_field = assignee_geolocation

[enrich_extra_data:github2] json_url = https://gist.githubusercontent.com/zhquan/bb48654bed8a835ab2ba9a149230b11a/raw/5eef38de508e0a99fa9772db8aef114042e82e47/bitergia-example.txt

[enrich_feelings] attributes = [title, body] nlp_rest_url = http://localhost:2901


#### gitlab [↑](#supported-data-sources-)
Issues and MRs from GitLab

GitLab issues and merge requests need to be configured in two different sections.
The corresponding dashboards can be automatically uploaded by setting `gitlab-issue` and `gitlab-merge`
to `true` in the `panels` section within the `setup.cfg`

If a given GitLab repository is under more than 1 level, all the slashes `/` starting from the second level have to be
replaced by `%2F`. For instance, for a repository with a structure similar to this one
`https://gitlab.com/Molly/lab/first`.
##### issue
- projects.json

{ "Chaoss": { "gitlab:issue": [ "https://gitlab.com/Molly/first", "https://gitlab.com/Molly/lab%2Fsecond" ] } }

- setup.cfg

[panels] gitlab-issues = true

[gitlab:issue] category = issue raw_index = gitlab-issues_raw enriched_index = gitlab-issues_enriched api-token = xxxx sleep-for-rate = true no-archive = true (suggested) studies = [enrich_onion:gitlab-issue] (optional)

[enrich_onion:gitlab-issue] (optional) in_index = gitlab-issues_enriched out_index = gitlab-issues-onion_enriched data_source = gitlab-issues

##### merge request
- projects.json

{ "Chaoss": { "gitlab:merge": [ "https://gitlab.com/Molly/first", "https://gitlab.com/Molly/lab%2Fsecond" ], } }

- setup.cfg

[panels] gitlab-merges = true

[gitlab:merge] category = merge_request raw_index = gitlab-mrs_raw enriched_index = gitlab-mrs_enriched api-token = xxxx sleep-for-rate = true no-archive = true (suggested) studies = [enrich_onion:gitlab-merge] (optional)

[enrich_onion:gitlab-merge] (optional) in_index = gitlab-mrs_enriched out_index = gitlab-mrs-onion_enriched data_source = gitlab-merges

#### gitter [↑](#supported-data-sources-)
Messages from gitter rooms 
- projects.json

{ "Chaoss": { "gitter": [ "https://gitter.im/jenkinsci/jenkins", ] } }

- setup.cfg

[gitter] raw_index = gitter_raw enriched_index = gitter_enriched_raw api-token = xxxxx sleep-for-rate = true sleep-time = "300" (optional) no-archive = true (suggested)


#### google_hits [↑](#supported-data-sources-)
Number of hits for a set of keywords from Google
- projects.json

{ "Chaoss": { "google_hits": [ "bitergia grimoirelab" ] } }

- setup.cfg

[google_hits] raw_index = google_hits_raw enriched_index =google_hits_enriched

#### groupsio [↑](#supported-data-sources-)
Messages from Groupsio

To know the lists you are subscribed to: https://gist.github.com/valeriocos/ad33a0b9b2d13a8336230c8c59df3c55

- projects.json

{ "Chaoss": { "groupsio": [ "group1", "group2" ] } }

- setup.cfg

[groupsio] raw_index = groupsio_raw enriched_index = groupsio_enriched email = yyyy password = xxxx

#### hyperkitty [↑](#supported-data-sources-)
Messages from a HyperKitty
- projects.json

{ "Chaoss": { "hyperkitty": [ "https://lists.mailman3.org/archives/list/mailman-users@mailman3.org" ] } }

- setup.cfg

[hyperkitty] raw_index = hyperkitty_raw enriched_index = hyperkitty_enriched

#### jenkins [↑](#supported-data-sources-)
Builds from a Jenkins

- projects.json

{ "Chaoss": { "jenkins": [ "https://build.opnfv.org/ci" ] } }

- setup.cfg

[jenkins] raw_index = jenkins_raw enriched_index = jenkins_enriched no-archive = true (suggested)

#### jira [↑](#supported-data-sources-)
Issues data from JIRA issue trackers

- projects.json

{ "Chaoss":{ "jira": [ "https://jira.opnfv.org" ] } }

- setup.cfg

[jira] raw_index = jira_raw enriched_index = jira_enriched no-archive = true (suggested) backend-user = yyyy (optional) backend-password = xxxx (optional)

#### kitsune [↑](#supported-data-sources-)
Questions and answers from KitSune

- projects.json

{ "Chaoss": { "kitsune": [ "" ] } }

- setup.cfg

[kitsune] raw_index = kitsune_raw enriched_index = kitsune_enriched


#### mattermost [↑](#supported-data-sources-)
Messages from Mattermost channels
- projects.json

{ "Chaoss": { "mattermost": [ "https://chat.openshift.io 8j366ft5affy3p36987pcugaoa" ] } }

- setup.cfg

[mattermost] raw_index = mattermost_raw enriched_index = mattermost_enriched api-token = xxxx

#### mbox [↑](#supported-data-sources-)
Messages from MBox files

For mbox files, it is needed the name of the mailing list and the path where the mboxes can be found. In the example
below, the name of the mailing list is set to "mirageos-devel".
- projects.json

{ "Chaoss": { "mbox": [ "mirageos-devel /home/bitergia/mbox/mirageos-devel/" ] } }

- setup.cfg

[mbox] raw_index = mbox_raw enriched_index = mbox_enriched

#### mediawiki [↑](#supported-data-sources-)
Pages and revisions from MediaWiki

-projects.json

{ "Chaoss": { "mediawiki": [ "https://www.mediawiki.org/w https://www.mediawiki.org/wiki" ] } }

- setup.cfg

[mediawiki] raw_index = mediawiki_raw enriched_index = mediawiki_enriched no-archive = true (suggested)

#### meetup [↑](#supported-data-sources-)
Events from Meetup groups

For meetup groups it is only needed the identifier of the meetup group
and an API token: https://chaoss.github.io/grimoirelab-tutorial/gelk/meetup.html#gathering-meetup-groups-data
- projects.json

{ "Chaoss": { "meetup": [ "Alicante-Bitergia-Users-Group", "South-East-Bitergia-User-Group" ] } }

- setup.cfg

[meetup] raw_index = meetup_raw enriched_index = meetup_enriched api-token = xxxx sleep-for-rate = true sleep-time = "300" (optional) no-archive = true (suggested)

#### mozillaclub [↑](#supported-data-sources-)
Events from Mozillaclub
- projects.json

{ "Chaoss": { "mozillaclub": [ "https://spreadsheets.google.com/feeds/cells/1QHl2bjBhMslyFzR5XXPzMLdzzx7oeSKTbgR5PM8qp64/ohaibtm/public/values?alt=json" ] } }

- setup.cfg

[mozillaclub] raw_index = mozillaclub_raw enriched_index = mozillaclub_enriched

#### nntp [↑](#supported-data-sources-)
Articles from NNTP newsgroups

The way to setup netnews is adding the server and the news channel to be monitored. In the example below,
the `news.myproject.org` is the server name.
- projects.json

{ "Chaoss": { "nntp": [ "news.myproject.org mozilla.dev.tech.crypto.checkins", "news.myproject.org mozilla.dev.tech.electrolysis", "news.myproject.org mozilla.dev.tech.gfx", "news.myproject.org mozilla.dev.tech.java" ] } }

- setup.cfg

[nntp] raw_index = nntp_raw enriched_index = nntp_enriched

#### pagure [↑](#supported-data-sources-)
Issues from Pagure repositories

- projects.json

{ "Chaoss": { "pagure": [ "https://pagure.io/Test-group/Project-example-namespace" ] } }

- setup.cfg

[pagure] raw_index = pagure_raw enriched_index = pagure_enriched api-token = xxxx sleep-for-rate = true sleep-time = "300" (optional) no-archive = true (suggested)

#### phabricator [↑](#supported-data-sources-)
Tasks from Phabricator

- projects.json

{ "Chaoss": { "phabricator": [ "https://phabricator.wikimedia.org" ] } }

- setup.cfg

[phabricator] raw_index = phabricator_raw enriched_index = phabricator_enriched api-token = xxxx no-archive = true (suggested)

#### pipermail [↑](#supported-data-sources-)
Messages from Pipermail

- projects.json

{ "Chaoss": { "pipermail": [ "https://lists.linuxfoundation.org/pipermail/grimoirelab-discussions/" ] } }

- setup.cfg

[pipermail] raw_index = pipermail_raw enriched_index = pipermail_enriched

#### puppetforge [↑](#supported-data-sources-)
Modules and their releases from Puppet's forge

- projects.json

{ "Chaoss": { "puppetforge": [ "" ] } }

- setup.cfg

[puppetforge] raw_index = puppetforge_raw enriched_index = puppetforge_enriched

#### redmine [↑](#supported-data-sources-)
Issues from Redmine
- project.json

{ "Chaoss": { "redmine": [ "http://tracker.ceph.com/" ] } }

- setup.cfg

[redmine] raw_index = redmine_raw enriched_index = redmine_enriched api-token = XXXXX

#### remo [↑](#supported-data-sources-)
Events, people and activities from ReMo
- project.json

{ "Chaoss": { "remo": [ "https://reps.mozilla.org" ] } }

- setup.cfg

[remo] raw_index = remo_raw enriched_index = remo_enriched

#### rocketchat [↑](#supported-data-sources-)
Messages from Rocketchat channels
- projects.json

{ "Chaoss": { "rocketchat": [ "https://open.rocket.chat general" ] } }

- setup.cfg

[rocketchat] raw_index = rocketchat_raw enriched_index = rocketchat_enriched api-token = xxxx sleep-for-rate = true user-id = xxxx no-archive = true (suggested)

#### rss [↑](#supported-data-sources-)
Entries from RSS feeds

- project.json

{ "Chaoss": { "remo": [ "https://reps.mozilla.org" ] } }

- setup.cfg

[rss] raw_index = rss_raw enriched_index = rss_enriched

#### slack [↑](#supported-data-sources-)
Messages from Slack channels

The information needed to monitor slack channels is the channel id.
- projects.json

{ "Chaoss": { "slack": [ "A195YQBLL", "A495YQBM2" ] } }

- setup.cfg

[slack] raw_index = slack_raw enriched_index = slack_enriched api-token = xxxx no-archive = true (suggested)

#### stackexchange [↑](#supported-data-sources-)
Questions, answers and comments from StackExchange

- projects.json

{ "Chaoss": { "stackexchange": [ "http://stackoverflow.com/questions/tagged/chef", "http://stackoverflow.com/questions/tagged/chefcookbook", "http://stackoverflow.com/questions/tagged/ohai", "http://stackoverflow.com/questions/tagged/test-kitchen", "http://stackoverflow.com/questions/tagged/knife" ] } }

- setup.cfg

[stackexchange] raw_index = stackexchange_raw enriched_index = stackexchange_enriched api-token = xxxx no-archive = true (suggested)

#### supybot [↑](#supported-data-sources-)
Messages from Supybot log files

For supybot files, it is needed the name of the IRC channel and the path where the logs can be found. In the example
below, the name of the channel is set to "irc://irc.freenode.net/atomic".
- projects.json

{ "Chaoss": { "supybot": [ "irc://irc.freenode.net/atomic /home/bitergia/irc/percevalbot/logs/ChannelLogger/freenode/#atomic" ] } }

- setup.cfg

[supybot] raw_index = supybot_raw enriched_index = supybot_enriched


#### telegram [↑](#supported-data-sources-)
Messages from Telegram

You need to have an API token: https://github.com/chaoss/grimoirelab-perceval#telegram

- projects.json

{ "Chaoss": { "telegram": [ "Mozilla_analytics" ] } }

- setup.cfg

[telegram] raw_index = telegram_raw enriched_index = telegram_enriched api-token = XXXXX

#### twitter [↑](#supported-data-sources-)
Messages from Twitter

You need to provide a [search query](https://developer.twitter.com/en/docs/tweets/search/guides/build-standard-query) and an API token (which requires to create an [app](https://developer.twitter.com/en/docs/basics/apps/overview)). The script at https://gist.github.com/valeriocos/7d4d28f72f53fbce49f1512ba77ef5f6 helps obtaining a token.

- projects.json

{ "Chaoss": { "twitter": [ "bitergia" ] } }

- setup.cfg

[twitter] raw_index = twitter_raw enriched_index = twitter_enriched api-token = XXXX


## Micro Mordred [↑](#contents)

Micro Mordred is a simplified version of Mordred which omits the use of its scheduler. Thus, Micro Mordred allows to run single Mordred tasks (e.g., raw collection, enrichment) per execution.

Micro Mordred is located in the [/utils](https://github.com/chaoss/grimoirelab-sirmordred/tree/master/utils/micro.py) folder of this same repository. It can be executed via command line, its parameters are summarized below:

--debug: execute Micro Mordred in debug mode

--raw: activate raw task

--enrich: activate enrich task

--identities: activate merge identities task

--panels: activate panels task

--cfg: path of the configuration file

--backends: list of cfg sections where the active tasks will be executed

--logs-dir: single parameter denoting the path of folder in which logs are to be stored


Examples of possible executions are shown below:

cd .../grimoirelab-sirmordred/utils/ micro.py --raw --enrich --cfg ./setup.cfg --backends git # execute the Raw and Enrich tasks for the Git cfg section micro.py --panels # execute the Panels task to load the Sigils panels to Kibiter micro.py --raw --enrich --debug --cfg ./setup.cfg --backends groupsio --logs-dir logs # execute the raw and enriched tasks for the groupsio cfg section with debug mode on and logs being saved in the folder logs in the same directory as micro.py