DHIS version 2.34 is released

Dear all,

DHIS2 version 2.34 is out with many new features, apps, improvements and bug fixes. This version is fully compatible with the version 2.1 Android Capture App.


ANALYTICS FEATURES

Pivot tables in Data visualizer app: The Data visualizer app now supports pivot tables, meaning the functionality of the pivot table app is merged into the data visualizer app. A pivot table is now just another visualization type within the data visualizer app. This provides users with a more intuitive experience for building pivot tables, and it more seamlessly allows moving between pivot tables and other chart types. The performance of pivot tables is also dramatically improved, allowing for very large pivot tables with at least three times more data than the classic pivot table app.

Jira | Screenshot 1 | 2 | 3

Dimension recommendations: In the data visualizer app, pivot tables now support “dimension recommendations”, which means that dimensions which are relevant to the select data elements will be indicated in the left panel with a green dot.

Screenshot

Continuous analytics table update: The analytics table scheduler now supports continuous updates of analytics tables, offering a “real-time analytics” experience. The delay between data being entered and data becoming visible in analytics apps will now be in seconds, compared to hours or days. A new table partition which contains the latest data is introduced which allows for quicker updates. This can be configured in the Scheduler app by selecting the Continuous analytics table job type. The Delay in seconds field refers to the delay in seconds in between each update of the latest data partition. The Full update hour of day field refers to the time of the day at which the full analytics table update will run.

Screenshot | Docs

Progressive caching: Progressive caching reduces the time to render dashboards and speeds-up analytics by creating a new cache layer. Essentially this enables data to be viewed in the analytics immediately after being entered without running the analytics tables.

Jira

Legends for single values: Legends can now be added to single value chart types. The text color of the value is decided by the legend that the value falls within. This enables users to more effectively communicate the relative performance of values.

Jira | Screenshot

Improved gauge charts: The usefulness of gauge charts has been dramatically improved. Now a gauge chart can include baselines and target lines, a legend that will change the color of the chart based on the value shown, and minimum and maximum data ranges.

Jira 1 | 2 | 3 | Screenshot 1 | 2

Sort by totals in pivot tables: You can now sort by subtotal and total columns in pivot tables.

Screenshot

Dashboard item visual improvements: Each dashboard item has text wrapping for long names. All dashboard item options are now available as a menu instead of icons, giving more space for the title and makes titles more visible in the dashboard.

Screenshot

Pivot table and chart type visualization filter: In the list of visualizations, a visualization type filter is available and lets you filter by pivot tables and charts. An icon representing the visualization type is displayed for each row in the list, making it quick to see the type for each visualization.

Jira | Screenshot

Maps enhancements and WebGL: The mapping engine in version 2.34 is brand-new and based on the WebGL technology which is much more performant compared to the previous solution.

Jira

The following key features are now available in Maps:

  • Performance: We are now capable of showing thousands of features on a map simultaneously, and the maps are much more responsive.

    Screenshot

  • Map rotation and tilting: You can now rotate and tilt the map to enhance the view of your data.

    Screenshot

  • Continuous zoom: The zoom is now continuous, allowing you to fit the map perfectly to your content and avoids the previously large zoom “steps”.

  • Full-screen view: Maps can now be viewed in full-screen mode. This is especially useful for dashboard maps where space is limited. You can click the full-screen button on the right side of the map to enable it.

  • Bing Maps: Google Maps is no longer supported due to technical and legal issues, but we have included four new base maps from Bing, which should be a good replacement.

    Screenshot

  • Donut clusters: We have added support for “donut clusters” which will show you the event cluster distribution if you style by a data element.

    Screenshot


TRACKER AND EVENT FEATURES

Performance and stability improvements: A range of improvements have been made related to performance and security:

  • Tracker capture performance: Jira
  • Monitoring Infrastructure: Jira
  • Improved caching: Jira
  • Various bug fixes: Jira
  • Antlr parsing of program rules: Jira

Enhanced audit service: An audit trail is now stored for all types of metadata and data. The audit trail is enabled by default and is configurable in this dhis.conf configuration file. The solution is centralized and is based on the Apache ActiveMQ Artemis asynchronous message broker. The audit solution covers create, read, update and delete operations across metadata, aggregate data and tracker data. Audit logs can currently be retrieved from the audit table in the DHIS2 database.

Jira | Docs

Predefined event views in Capture app: In the capture app it is now possible to save and share custom predefined list views/event filters. A user can save a named filter based on any otherwise filterable attributes like event data values, event dates, assignees, and so on. This can be a private filter or shared so that other users can see and utilize it. One use case for such filters can be to create a default working list of events assigned to the logged in user.

Jira | Screenshot | Docs

Tracker capture search for relatives: It is now possible for a user to search for and link a relationship to any tracked entity instance in their search scope. Previously it was only possible to search and link relationships within the users reporting organization unit. Searching across different organizations is useful in Covid-19 contact tracing where the contacts might live in another part of the country.

Jira | Screenshot | Docs


APPS FEATURES

Data approval: The data approval functionality is re-introduced as a separate app called Data approval. It offers the same functionality which was previously accessible through the Reports app. It allows for approving data by data set and time period. We are working on a new approval app using our new technology stack which will support the data approval workflow model.

Screenshot

App Hub: The App Store has been rebranded as the App Hub. The App Hub has been rewritten to support improved management of apps. DHIS2 2.34 uses the new App Hub (https://apps.dhis2.org) by default. Apps from the old App Store have been migrated to the new App Hub where possible. The old App Store link, used by previous versions of DHIS2, will continue to work, but will be seamlessly redirected to the new App Hub in the near future. App developers should now use the new App Hub for sharing your apps.

https://apps.dhis2.org

Attribute ID schemes in data import-export: The import-export app now allows for selecting attribute-based identifier schemes for data import and export.

Screenshot | Jira


API FEATURES

New combined endpoint for analytics visualizations: The reportsTables and charts endpoints have been deprecated in favour of a new and consolidated visualizations endpoint.

Docs


RELEASE INFO

Release Information Links
Download release and sample database https://www.dhis2.org/downloads
Documentation and Javadocs https://www.dhis2.org/documentation
Upgrade notes Upgrade notes for 2.34 on GitHub
Details about each feature on JIRA (requires login) 2.34 Features
Overview of bugs fixed on JIRA (requires login) 2.34 Bugs
Source code on Github https://github.com/dhis2
Demo instance https://play.dhis2.org/2.34.0/
Docker docker pull dhis2/core:2.34.0
for more docker image variants see dockerhub
11 Likes

This is great news for DHIS2 Users. Many thanks to the Developers who have worked round-the-clock to make this happen.

1 Like

Wow, Great news Philip. I thank you guys for the great work.

1 Like

Hi @phil, thanks for 2.34 version.

And I have problem with 2.34.


HTTP Status 500 - Filter execution threw an exception
type Exception report

message Filter execution threw an exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Filter execution threw an exception
org.hisp.dhis.servlet.filter.HttpUrlPatternFilter.doFilter(HttpUrlPatternFilter.java:120)
org.springframework.orm.hibernate5.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:156)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
root cause

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.changeSessionId()Ljava/lang/String;
org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy.applySessionFixation(ChangeSessionIdAuthenticationStrategy.java:40)
org.springframework.security.web.authentication.session.AbstractSessionFixationProtectionStrategy.onAuthentication(AbstractSessionFixationProtectionStrategy.java:87)
org.springframework.security.web.authentication.session.ChangeSessionIdAuthenticationStrategy.onAuthentication(ChangeSessionIdAuthenticationStrategy.java:28)
org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy.onAuthentication(CompositeSessionAuthenticationStrategy.java:89)
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.hisp.dhis.security.filter.CustomAuthenticationFilter.doFilter(CustomAuthenticationFilter.java:69)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:180)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.hisp.dhis.security.filter.AutomaticAccessFilter.doFilter(AutomaticAccessFilter.java:115)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92)
org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:152)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215)
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)
org.hisp.dhis.servlet.filter.HttpUrlPatternFilter.doFilter(HttpUrlPatternFilter.java:120)
org.springframework.orm.hibernate5.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:156)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271)


Br,
Taufiq

@taufiqhs This looks like you have a version of Tomcat (and the Servlet API) or JDK which is too old. We now require Tomcat 8.5.50 and Java 8. Please open a new thread for this outside the 2.34 released thread, or open a Jira ticket at jira.dhis2.org.

2 Likes

Hai @Lars

Thanks, I will check and test.

Taufiq

1 Like

Hi Taufiq

Tomcat 9 should also be fine. There are a few weirdnesses around
logging on debian based distributions, but it works well.

1 Like

Hai Taufiq,

Were you able to resolve this issue by upgrading your tomcat and java?

Please keep us posted on how it goes.

Best,

Morley

1 Like

Great work of improvements! I appreciate very much the Progressive caching, the Continuous analytics table update and many other improvements . It can be also vary useful the Predefined event views in Capture app in order to organize verification of the entered events and shared work.
I really appreciate all the work done in this hard period by the project leads and developer team! Thanks for your work!
But there are some issues in the old version 2.33 still present in the new 2.34 (I waited for the new version to test it). Here 2 of them I reported on Jira that hinder our work.

  1. [DHIS2-8730] Capture Web App - Event list Filter - type mismatch
    https://jira.dhis2.org/browse/DHIS2-8730
    (TO DO)
  • it don’t permit to search for a string of only digits in the event list filter - for example to find a record as some File Identifier with only numbers. If you have at least one letter, the problem doesn’t exist, but usually in some hospitals the file identifier is composed by only digits. The Predefined event views in Capture app can’t be used in many cases because of this problem.
  1. [DHIS2-8729] - Option Group Set - No dimension created
    https://jira.dhis2.org/browse/DHIS2-8729
    (OPEN)
  • will permit to create different groupings of ICD-10 diagnosis
  1. Classification/aggregation of the event diagnosis by ICD-10 Chapters (I to XXII) - see the WHO documentation https://icd.who.int/browse10/2019
  2. Classification/aggregation of the event diagnosis by ICD-10 letter - (A, B, C, …Z, U)
  3. Classification/aggregation of the event diagnosis by ICD-10 by the WHO Global Health Estimates (GHE) - https://www.who.int/healthinfo/global_burden_disease/en/
  4. Other aggregation of the Captured Events based on specific disease groups.

The feature is already described in the documentation - see
22.10.4 Create or edit an option group set
https://docs.dhis2.org/2.33/en/user/html/manage_option_set.html#create_option_group_set
but is still not working - the 2.34 documentation is the same for this item.

Thanks for your comprehension.

2 Likes