Internally, the Drupal Association is tracking more metrics this year. To start, we are running the queries below. In the future, these should be made into sampler metrics and put on https://drupal.org/metrics.

  • Number of Active Accounts (logged in 1x per period of time)
  • Number of Active Accounts (at least 1 activity per period of time)
  • Number of Blocked Accounts (on this specific date)
  • Number of Participants in the Issue Queues (who commented)
  • Number of Participants in the Drupal Core Issue Queue (who commented)
  • Number of Commits across All Projects
  • Number of Commits to Drupal Core
  • Number of Committers (at least 1 commit, all full projects, excluding Core)
  • Number of Commits per User (excluding commits to Drupal Core)
  • (overall commits / # of committers, both numbers excluding Drupal core and sandboxes)
  • Number of Comments (created during the time period)
  • Number of Comments on Issues (created during the time period)
  • Number of Comments on Drupal Core Issues (created during the time period)
  • Average Number of Comments per User (created during the time period)
  • (overall comments / # of commenters)
  • Average Number of Comments per User on Issues
  • Average Number of Comments per User on Drupal Core Issues
  • Number of Comments on Issues, which Updated the Node
  • Number of Issues (created during the time period)
  • Average Number of Issues per User (created during the time period)
  • Number of Projects (created during the time period)
  • Number of Sandbox Projects (created during the time period)
  • Number of Full Projects (created during the time period)
  • % issues about Drupal.org responded to in 48 hours
  • (% of issues, created during the time period, which received first comment, not from the issue author, in less than
  • Testbot (queries against qa.d.o)
  • # of test requests sent
  • # of Drupal core patches tested / Average core test queue time (min) / Average core test duration (min) / Average
  • Same, D7 only
  • Same, D8 only
  • Number of Open Issues per Queue
  • Content
  • Webmasters
  • Infrastructure
  • Bluecheese ??
  • Drupalorg nodes
  • Drupalorg_crosssite nodes
  • G.d.o queue
  • A.d.o queue
  • Average Response Time across All Queues (hours)
  • (avg. time between issue published and 1st comment, not by issue author, created)
  • Average Response Time in Drupal Core Issue Queue (hours)
  • Average Response Time in Drupal.org Issue Queues (hours)
  • (Content, Webmasters, Infrastructure, Bluecheese, Drupalorg, Drupalorg_crosssite)
  • Number of Drupal core downloads
-- Number of Active Accounts (logged in 1x per period of time)
SELECT COUNT(*) FROM users WHERE status = 1 AND access > UNIX_TIMESTAMP('2014-01-01');
-- Number of Active Accounts (at least 1 activity per period of time)
SELECT count(1) 
FROM users u 
WHERE u.status = 1 AND u.uid IN (SELECT DISTINCT n.uid FROM node n WHERE n.status = 1 AND n.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31') 
UNION SELECT DISTINCT c.uid FROM comment c WHERE c.status = 1 AND c.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31') 
UNION SELECT DISTINCT nr.uid FROM node_revision nr WHERE nr.status = 1 AND nr.timestamp BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31') 
UNION SELECT DISTINCT o.author_uid 
FROM versioncontrol_operations o 
WHERE o.committer_date BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31'));
-- Number of Blocked Accounts (on this specific date)
SELECT COUNT(*) FROM users WHERE status=0;
-- Number of Participants in the Issue Queues (who commented)
SELECT COUNT(DISTINCT(c.uid))
FROM comment c
INNER JOIN node n ON c.nid = n.nid AND n.status = 1
INNER JOIN users u ON u.uid = c.uid AND u.status = 1
WHERE n.type = 'project_issue' AND c.status = 1 
AND c.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Participants in the Drupal Core Issue Queue (who commented)
SELECT COUNT(DISTINCT(c.uid))
FROM comment c
INNER JOIN field_data_field_project fdfp ON fdfp.entity_id = c.nid AND fdfp.field_project_target_id = 3060
INNER JOIN node n ON c.nid = n.nid AND n.type = 'project_issue' AND n.status = 1
INNER JOIN users u ON u.uid = c.uid AND u.status = 1
WHERE c.status = 1 
AND c.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Commits across All Projects
SELECT COUNT(DISTINCT vco.revision) AS commits 
FROM versioncontrol_operations vco 
WHERE vco.committer_date BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Commits to Drupal Core
SELECT COUNT(DISTINCT vco.revision) AS commits 
FROM versioncontrol_operations vco 
WHERE vco.repo_id=2 AND vco.committer_date BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Committers (at least 1 commit, all full projects, excluding Core)
SELECT COUNT(DISTINCT vco.committer) AS committers
FROM versioncontrol_operations vco
INNER JOIN versioncontrol_project_projects vp ON vp.repo_id = vco.repo_id AND vp.nid <> 3060
INNER JOIN field_data_field_project_type t ON t.entity_id = vp.nid AND t.field_project_type_value = 'full'
WHERE vco.committer_date BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Commits per User (excluding commits to Drupal Core)
-- (overall commits / # of committers, both numbers excluding Drupal core and sandboxes)
SELECT COUNT(DISTINCT vco.revision) / COUNT(DISTINCT vco.committer) AS commits_per_committer
FROM versioncontrol_operations vco
INNER JOIN versioncontrol_project_projects vp ON vp.repo_id = vco.repo_id AND vp.nid <> 3060
INNER JOIN field_data_field_project_type t ON t.entity_id = vp.nid AND t.field_project_type_value = 'full'
WHERE vco.committer_date BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Comments (created during the time period)
SELECT COUNT(c.cid) comments
FROM comment c
INNER JOIN node n ON c.nid = n.nid AND n.status = 1
INNER JOIN users u ON u.uid = c.uid AND u.status = 1
WHERE c.status = 1 AND c.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Comments on Issues (created during the time period)
SELECT COUNT(c.cid) comments 
FROM comment c
INNER JOIN node n ON n.nid = c.nid AND n.type = 'project_issue' AND n.status = 1
INNER JOIN users u ON u.uid = c.uid AND u.status = 1
WHERE c.status = 1 AND c.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Comments on Drupal Core Issues (created during the time period)
SELECT COUNT(c.cid) comments 
FROM comment c
INNER JOIN field_data_field_project fdfp ON fdfp.entity_id = c.nid AND fdfp.field_project_target_id = 3060
INNER JOIN node n ON n.nid = c.nid AND n.type = 'project_issue' AND n.status = 1
INNER JOIN users u ON u.uid = c.uid AND u.status = 1
WHERE c.status = 1 AND c.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Average Number of Comments per User (created during the time period)
-- (overall comments / # of commenters)
SELECT COUNT(c.cid) / COUNT(DISTINCT c.uid) AS comments_per_user
FROM comment c
INNER JOIN node n ON c.nid = n.nid AND n.status = 1
INNER JOIN users u ON u.uid = c.uid AND u.status = 1
WHERE c.status = 1 AND c.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Average Number of Comments per User on Issues 
SELECT COUNT(c.cid) / COUNT(DISTINCT c.uid) AS comments_per_user
FROM comment c
INNER JOIN node n ON c.nid = n.nid AND n.type = 'project_issue' AND n.status = 1
INNER JOIN users u ON u.uid = c.uid AND u.status = 1
WHERE c.status = 1 AND c.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Average Number of Comments per User on Drupal Core Issues
SELECT COUNT(c.cid) / COUNT(DISTINCT c.uid) AS comments_per_user
FROM comment c
INNER JOIN field_data_field_project fdfp ON fdfp.entity_id = c.nid AND fdfp.field_project_target_id = 3060
INNER JOIN node n ON c.nid = n.nid AND n.type = 'project_issue' AND n.status = 1
INNER JOIN users u ON u.uid = c.uid AND u.status = 1
WHERE c.status = 1 AND c.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Comments on Issues, which Updated the Node
SELECT COUNT(c.cid) comments 
FROM comment c
INNER JOIN node n ON n.nid = c.nid AND n.status = 1
INNER JOIN field_data_field_issue_changes ic ON ic.entity_id = c.cid
INNER JOIN users u ON u.uid = c.uid AND u.status = 1
WHERE c.status = 1 AND c.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Issues (created during the time period)
SELECT COUNT(n.nid)
FROM node n
INNER JOIN users u ON u.uid = n.uid AND u.status = 1
WHERE n.type = 'project_issue' AND n.status = 1 AND n.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Average Number of Issues per User (created during the time period)
SELECT COUNT(n.nid) / COUNT(DISTINCT n.uid) AS issues_per_user
FROM node n
INNER JOIN users u ON u.uid = n.uid AND u.status = 1
WHERE n.type = 'project_issue' AND n.status = 1 AND n.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Projects (created during the time period)
SELECT COUNT(n.nid)
FROM node n
INNER JOIN users u ON u.uid = n.uid AND u.status = 1
INNER JOIN field_data_field_project_type t ON t.entity_id = n.nid
WHERE n.status = 1 AND n.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Sandbox Projects (created during the time period)
SELECT COUNT(n.nid)
FROM node n
INNER JOIN users u ON u.uid = n.uid AND u.status = 1
INNER JOIN field_data_field_project_type t ON t.entity_id = n.nid AND t.field_project_type_value = 'sandbox'
WHERE n.status = 1 AND n.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Number of Full Projects (created during the time period)
SELECT COUNT(n.nid)
FROM node n
INNER JOIN users u ON u.uid = n.uid AND u.status = 1
INNER JOIN field_data_field_project_type t ON t.entity_id = n.nid AND t.field_project_type_value = 'full'
WHERE n.status = 1 AND n.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- % issues about Drupal.org responded to in 48 hours
-- (% of issues, created during the time period, which received first comment, not from the issue author, in less than 48 hours after issue published, in the following queues: Content, Webmasters, Infrastructure, Bluecheese, Drupalorg, Drupalorg_crosssite)
SELECT sum(duration / 60 / 60 <= 48) / count(1) * 100 FROM (SELECT (min(c.created) - n.created) AS duration FROM node n INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id IN (1848824, 3202, 107028, 651778, 185188, 1540220) INNER JOIN comment c ON c.nid = n.nid AND c.uid <> n.uid WHERE n.type = 'project_issue' AND n.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31') GROUP BY n.nid ORDER BY NULL) t;
-- Testbot (queries against qa.d.o)
-- # of test requests sent
SELECT COUNT(test_id) FROM pifr_test WHERE type = 3 AND status = 4 AND last_received BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- # of Drupal core patches tested / Average core test queue time (min) / Average core test duration (min) / Average core total wait time (min)
SELECT COUNT(pt.test_id), AVG((pt.last_requested - pt.last_received)/60) AS avg_queue_time, AVG((pt.last_tested - pt.last_requested)/60) AS avg_test_duration, AVG((pt.last_tested - pt.last_received)/60) AS avg_total_wait FROM pifr_test pt LEFT JOIN pifr_file pf ON pt.test_id = pf.test_id WHERE pt.type = 3 AND pt.status = 4 AND pf.branch_id IN (1,2) AND pt.last_requested != 0 AND last_received BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');
-- Same, D7 only
SELECT COUNT(pt.test_id), AVG((pt.last_requested - pt.last_received)/60) AS avg_queue_time, AVG((pt.last_tested - pt.last_requested)/60) AS avg_test_duration, AVG((pt.last_tested - pt.last_received)/60) AS avg_total_wait FROM pifr_test pt LEFT JOIN pifr_file pf ON pt.test_id = pf.test_id WHERE pt.type = 3 AND pt.status = 4 AND pf.branch_id = 1 AND pt.last_requested != 0 AND last_received BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');

-- Same, D8 only
SELECT COUNT(pt.test_id), AVG((pt.last_requested - pt.last_received)/60) AS avg_queue_time, AVG((pt.last_tested - pt.last_requested)/60) AS avg_test_duration, AVG((pt.last_tested - pt.last_received)/60) AS avg_total_wait FROM pifr_test pt LEFT JOIN pifr_file pf ON pt.test_id = pf.test_id WHERE pt.type = 3 AND pt.status = 4 AND pf.branch_id = 2 AND pt.last_requested != 0 AND last_received BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31');

-- Number of Open Issues per Queue
-- Content
SELECT COUNT(n.nid)
FROM node n
INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id = 1848824
INNER JOIN field_data_field_issue_status fis ON fis.entity_id = n.nid
WHERE fis.field_issue_status_value IN (1,13,8,14,15,4,16);
-- Webmasters
SELECT COUNT(n.nid)
FROM node n
INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id = 3202
INNER JOIN field_data_field_issue_status fis ON fis.entity_id = n.nid
WHERE fis.field_issue_status_value IN (1,13,8,14,15,4,16);
-- Infrastructure
SELECT COUNT(n.nid)
FROM node n
INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id = 107028
INNER JOIN field_data_field_issue_status fis ON fis.entity_id = n.nid
WHERE fis.field_issue_status_value IN (1,13,8,14,15,4,16);
-- Bluecheese
SELECT COUNT(n.nid)
FROM node n
INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id = 651778
INNER JOIN field_data_field_issue_status fis ON fis.entity_id = n.nid
WHERE fis.field_issue_status_value IN (1,13,8,14,15,4,16);
-- Drupalorg
SELECT COUNT(n.nid)
FROM node n
INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id = 185188
INNER JOIN field_data_field_issue_status fis ON fis.entity_id = n.nid
WHERE fis.field_issue_status_value IN (1,13,8,14,15,4,16);
-- Drupalorg_crosssite
SELECT COUNT(n.nid)
FROM node n
INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id = 1540220
INNER JOIN field_data_field_issue_status fis ON fis.entity_id = n.nid
WHERE fis.field_issue_status_value IN (1,13,8,14,15,4,16);
-- G.d.o queue
SELECT COUNT(n.nid)
FROM node n
INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id = 833750
INNER JOIN field_data_field_issue_status fis ON fis.entity_id = n.nid
WHERE fis.field_issue_status_value IN (1,13,8,14,15,4,16);
-- A.d.o queue
SELECT COUNT(n.nid)
FROM node n
INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id = 1369118
INNER JOIN field_data_field_issue_status fis ON fis.entity_id = n.nid
WHERE fis.field_issue_status_value IN (1,13,8,14,15,4,16);
-- Average Response Time across All Queues (hours)
-- (avg. time between issue published and 1st comment, not by issue author, created)
SELECT avg(duration) / 60 / 60 FROM (SELECT (min(c.created) - n.created) AS duration FROM node n INNER JOIN comment c ON c.nid = n.nid AND c.uid <> n.uid WHERE n.type = 'project_issue' AND n.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31') GROUP BY n.nid ORDER BY NULL) t;
-- Average Response Time in Drupal Core Issue Queue (hours)
SELECT avg(duration) / 60 / 60 FROM (SELECT (min(c.created) - n.created) AS duration FROM node n INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id = 3060 INNER JOIN comment c ON c.nid = n.nid AND c.uid <> n.uid WHERE n.type = 'project_issue' AND n.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31') GROUP BY n.nid ORDER BY NULL) t;
-- Average Response Time in Drupal.org Issue Queues (hours)
-- (Content, Webmasters, Infrastructure, Bluecheese, Drupalorg, Drupalorg_crosssite)
SELECT avg(duration) / 60 / 60 FROM (SELECT (min(c.created) - n.created) AS duration FROM node n INNER JOIN field_data_field_project fp ON fp.entity_id = n.nid AND fp.field_project_target_id IN (1848824, 3202, 107028, 651778, 185188, 1540220) INNER JOIN comment c ON c.nid = n.nid AND c.uid <> n.uid WHERE n.type = 'project_issue' AND n.created BETWEEN UNIX_TIMESTAMP('2014-01-01') AND UNIX_TIMESTAMP('2014-01-31') GROUP BY n.nid ORDER BY NULL) t;

-- Number of Drupal core downloads
SELECT td.name, sum(rfd.field_release_file_downloads_value)
FROM field_data_field_release_files rf 
INNER JOIN field_data_field_release_project rp ON rp.entity_id = rf.entity_id AND rp.field_release_project_target_id = 3060 
INNER JOIN field_data_taxonomy_vocabulary_6 api ON api.entity_id = rf.entity_id 
INNER JOIN taxonomy_term_data td ON td.tid = api.taxonomy_vocabulary_6_tid 
INNER JOIN field_data_field_release_file_downloads rfd ON rfd.entity_id = rf.field_release_files_value 
GROUP BY api.taxonomy_vocabulary_6_tid;

Comments

mgifford’s picture

Issue summary: View changes

Just trying to show the list of items in a more readable fashion.

I love this idea. Thanks for posting this @drumm! I look forward to having more of this data available for the community.

mgifford’s picture

I was just wondering the % of mobile traffic is on Drupal.org. That change would be interesting to see too.

mgifford’s picture

Adding link to https://groups.drupal.org/node/136139

@leisareichelt posts some success metrics she would be looking for:

I've tried to roughly summarize the thread here:

  • Are more people contributing. A good measure of this might be the ratio of active contributors (say people who have added a comment to an issue or committed code to core/contrib in the past six months?) to overall Drupal.org members. More == better - Active might also mean 'following' or 'voting' if we add those things into the mix.
  • Are people contributing more actively. A good measure might be the average contributions (where contribution = comment in issue queue or code committed) per active contributor per six months?
  • Are contributions more effective - so perhaps we want to measure the average 'duration' of an issue opened in the past x months (duration being the time between the issue being opened and being closed - I figure this is better than measuring the number of comments etc. because, as long as the issue is resolved swiftly, having more people in the mix and more conversation may be a good thing, right?
  • better statistics about Drupal core development as well, instead of just number of committed patch contributors (and committed patches per contributor)
  • Number of unique users who post patches.
  • Number of unique users who post any kind of file upload.
  • Number of users who posted any kind of comment to an issue.
  • Number of users who posted a comment on an issue longer than x characters (to filter out +1/subscribe).
  • Number of unique users who change the status of an issue (or some other meta data change)
  • same again divided by the status it's changed to (rtbc, fixed, needs work, won't fix, needs more info, duplicate being the main ones).
  • Number of bug fixes in a release. We sorta have that now with the changelogs, but they're not very user-friendly.
  • Number of issues a user has had marked dup.
  • ratio of people who posted something in an issue queue (ever, in the past year etc), compared to the project usage statistics.

EDIT: Also, lots of good ideas from https://groups.drupal.org/node/144624

  • Total no. Drupal.org members who have logged in at least once (this is the count the Drupal.org front page uses):
  • Total no. of Drupal.org members who have been active in the last 6 months (active = posted to issue queue, discussion forum, updated documentation, posted to GDO, committed code, etc.
  • Number of of issues posted in the past six months
  • Total open issues
  • Total issues resolved in past six months
  • Average no. people contributing per issue
  • Average comments per issue
  • Average duration (time from date opened to date closed)
  • number of non-blocked users created in each year.
  • number of comments posted in each year.
  • unique users posting comments in each year
  • unique users posting nodes in each year
  • posting by node type - i.e. how many unique users post forum topics vs. issues vs. handbook pages.

Also https://groups.drupal.org/node/6551

EDIT: Useful also to know the number of users who have identified mentors. Is this number growing and if so at what rate?

mgifford’s picture

mparker17’s picture

Title: Add more metrics » [meta] Add more metrics

Given all the requirements, I think that this has become a meta issue.

YesCT’s picture

drumm’s picture

Added #1556474: Convert http://drupal.org/metrics to be driven by sampler metrics as a child issue. Like the metrics on project pages, these metrics should be collected with sampler module.

cweagans’s picture

Not sure if this is the right issue, but I would also like to see project-level metrics. For instance, being able to see a summary of open issues by component, priority, and version would be pretty helpful for determining which components need the most help at any particular point. It would also be helpful to see the average time to issue resolution by component.