Skip to main content

Lightweight data-centric framework for working with scientific data

Project description

DLite

A lightweight data-centric framework for semantic interoperability

PyPi CI tests Documentation DOI

DLite is a C implementation of the SINTEF Open Framework and Tools (SOFT), which is a set of concepts and tools for using data models (aka Metadata) to efficiently describe and work with scientific data.

DLite overview

The core of DLite is a framework for formalised representation of data described by data models (called Metadata or Entity in DLite). On top of this, DLite has a plugin system for various representations of the data in different formats and storages, as well as bindings to popular languages like Python, mappings to ontological concepts for enhanced semantics and a set of tools.

Documentation

The official documentation for DLite can be found on https://sintef.github.io/dlite/.

Installation

DLite is available on PyPI and can be installed with pip

pip install dlite-python[full]

The bracket [full] is optional, but ensures that you install all optional dependencies together with DLite. Without [full] you get a minimal DLite installation that only depends on NumPy. This would disable most storage plugins, except for the built-in "json", "bson" and "rdf" (when compiled against Redland librdf). For alternative installation methods, see the installation instructions.

Usage

All data in DLite is represented by a instance, which is described by a simple data model (aka Metadata). An Instance is identified by a unique UUID and have a set of named dimensions and properties. The dimensions are used to describe the shape of multi-dimensional properties.

DLite Metadata are identified by an URI and have an (optional) human readable description. Each dimension is given a name and description (optional) and each property is given a name, type, shape (optional), unit (optional) and description (optional). The shape of a property refers to the named dimensions. Foe example, a Metadata for a person serialised in YAML may look like:

uri: http://onto-ns.com/meta/0.1/Person
description: A person.
dimensions:
  nskills: Number of skills.
properties:
  name:
    type: string
    description: Full name.
  age:
    type: float32
    unit: year
    description: Age of person.
  skills:
    type: string
    shape: [nskills]
    description: List of skills.

Assume that you have file Person.yaml with this content. In Python, you can load this Metadata with

import dlite
Person = dlite.Instance.from_location("yaml", "Person.yaml", options="mode=r")

where the first argument is the "driver", i.e. the name of storage plugin to use for loading the Metadata. The options argument is optional. By providing "mode=r" you specify that the storage is opened in read-only mode.

You can verify that Person is a Metadata

>>> isinstance(Person, dlite.Metadata)
True

We can create an instance of Person with

homes = Person(
    dimensions={"nskills": 4},
    properties={
      "name": "Sherlock Homes",
      "skills": ["observing", "chemistry", "violin", "boxing"],
    }
)

The dimensions argument must be supplied when a Metadata is instantiated. It ensures that the shape of all properties are initialised consistently. The properties argument is optional. By specifying it, we initialise the properties to the provided values (otherwise, they will be initialised to zero).

In this case we didn't initialised the age

>>> homes.age
0.0
>>> homes.age = 34  # Assign the age

We can view (a JSON representation of) the instance with

>>> print(homes)
{
  "uuid": "314ac1ad-4a7e-477b-a56c-939121355112",
  "meta": "http://onto-ns.com/meta/0.1/Person",
  "dimensions": {
    "nskills": 4
  },
  "properties": {
    "Sherlock Holmes" {
      "age": 34.0,
      "skills": [
        "observing",
        "chemistry",
        "violin",
        "boxing"
      ]
    }
  }
}

The instance can also be stored using the save() method

homes.save("yaml", "homes.yaml", "mode=w")

which will produce the a YAML file with the following content

8cbd4c09-734d-4532-b35a-1e0dd5c3e8b5:
  meta: http://onto-ns.com/meta/0.1/Person
  dimensions:
    nskills: 4
  properties:
    Sherlock Holmes:
      age: 34.0
      skills:
      - observing
      - chemistry
      - violin
      - boxind

This was just a brief example. There is much more to DLite as will be revealed in the documentation.

License

DLite is licensed under the MIT license. However, it include a few third party source files with other permissive licenses. All of these should allow dynamic and static linking against open and propritary codes. A full list of included licenses can be found in LICENSES.txt.

Acknowledgment

In addition from internal funding from SINTEF and NTNU this work has been supported by several projects, including:

  • AMPERE (2015-2020) funded by Forskningsrådet and Norwegian industry partners.
  • FICAL (2015-2020) funded by Forskningsrådet and Norwegian industry partners.
  • Rational alloy design (ALLDESIGN) (2018-2022) NTNU internally funded project.
  • SFI Manufacturing (2015-2023) funded by Forskningsrådet and Norwegian industry partners.
  • SFI PhysMet (2020-2028) funded by Forskningsrådet and Norwegian industry partners.
  • OntoTrans (2020-2024) that receives funding from the European Union’s Horizon 2020 Research and Innovation Programme, under Grant Agreement n. 862136.
  • OpenModel (2021-2025) that receives funding from the European Union’s Horizon 2020 Research and Innovation Programme, under Grant Agreement n. 953167.
  • DOME 4.0 (2021-2025) that receives funding from the European Union’s Horizon 2020 Research and Innovation Programme, under Grant Agreement n. 953163.
  • VIPCOAT (2021-2025) that receives funding from the European Union’s Horizon 2020 Research and Innovation Programme, under Grant Agreement n. 952903.
  • MEDIATE (2022-2025) that receives funding from the RCN, Norway; FNR, Luxenburg; SMWK Germany via the M-era.net programme, project9557,
  • MatCHMaker (2022-2026) that receives funding from the European Union’s Horizon 2020 Research and Innovation Programme, under Grant Agreement n. 101091687.

DLite is developed with the hope that it will be a delight to work with.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

DLite-Python-0.4.3.tar.gz (17.1 kB view details)

Uploaded Source

Built Distributions

DLite_Python-0.4.3-cp311-cp311-win_amd64.whl (362.3 kB view details)

Uploaded CPython 3.11 Windows x86-64

DLite_Python-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

DLite_Python-0.4.3-cp310-cp310-win_amd64.whl (362.1 kB view details)

Uploaded CPython 3.10 Windows x86-64

DLite_Python-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

DLite_Python-0.4.3-cp39-cp39-win_amd64.whl (362.1 kB view details)

Uploaded CPython 3.9 Windows x86-64

DLite_Python-0.4.3-cp39-cp39-musllinux_1_1_i686.whl (388.7 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

DLite_Python-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

DLite_Python-0.4.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl (15.7 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686

DLite_Python-0.4.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ x86-64

DLite_Python-0.4.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl (7.0 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.12+ i686

DLite_Python-0.4.3-cp38-cp38-win_amd64.whl (361.9 kB view details)

Uploaded CPython 3.8 Windows x86-64

DLite_Python-0.4.3-cp38-cp38-musllinux_1_1_i686.whl (388.7 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

DLite_Python-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

DLite_Python-0.4.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl (15.7 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686

DLite_Python-0.4.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

DLite_Python-0.4.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl (7.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686

DLite_Python-0.4.3-cp37-cp37m-win_amd64.whl (361.0 kB view details)

Uploaded CPython 3.7m Windows x86-64

DLite_Python-0.4.3-cp37-cp37m-musllinux_1_1_i686.whl (389.4 kB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

DLite_Python-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

DLite_Python-0.4.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl (15.7 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686

DLite_Python-0.4.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64

DLite_Python-0.4.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl (7.0 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ i686

File details

Details for the file DLite-Python-0.4.3.tar.gz.

File metadata

  • Download URL: DLite-Python-0.4.3.tar.gz
  • Upload date:
  • Size: 17.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.11.6

File hashes

Hashes for DLite-Python-0.4.3.tar.gz
Algorithm Hash digest
SHA256 9b333a513fc22dfaba7024001c89352248d3d93857a35a83eb15c949b4397475
MD5 53e3a1644b46a85a6f41d82d3c1682d6
BLAKE2b-256 e42bc69769bfcd31bc633f07a259968b5a9b26930b442fe569b89428e4f584fd

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 4ff9508f0bacc6529c9b73fab92ddafb06d30aa23ef9f290ed07acea3c5dfa92
MD5 945ab01f7d0f9b7e2f2bcda73895d8e4
BLAKE2b-256 48ac412ef07cc04e8d15ba6f561ea5dac21f1f73e8977c959dfe740cd2a0792b

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 19e40e44413214b9e23d2aa961c902091cf2cc30b5a33c61355846d7bf0db1a8
MD5 fbb7260f25760edfa9b9a1ced0adc873
BLAKE2b-256 0e1c8d6d4034f114855cb7a46cdbd03a2321125eaf6324b90e72382a60834462

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3cf8a64b5cc82fa3995f4798dd831d0775e0e8905eb1ec8eb1e1c102c800caa2
MD5 93b717b9b6030decd9a6cf53658ad438
BLAKE2b-256 1201456d4287603da1f57f73337e1c11b2f46e4263a1ae3bc8e976ab45c20d55

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8022f81470a8ad429938d81e7a52901279538869f038b2b7b57510731909a938
MD5 413eb8fbbecf6a64fcfd6c61ec874097
BLAKE2b-256 112d7fc1177ee2e002b8e00eb5e4bdfa0b15cb6150a7ed1bfa66fd72a6c2afb2

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 5c5289e95230e4413781e791fe568464b1da49b9e92af091f5a4c1b00ab3d832
MD5 831cd03eb14449a3153efed92ae1fd72
BLAKE2b-256 fe7d62365904df916d58ec56fba77affdf0657552865b807e0a94ab8d522a6f0

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp39-cp39-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 54d4c0b2cbe3dba30de956c2f13521562a9b7bf723daed39fb154ae9e1dfe1d5
MD5 af6fc49b867165a02ab3d43ca711d089
BLAKE2b-256 e7dc408bf007c636c262a736a32f0358a682b7126dfc4b81430fdb43bd62b21d

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a0379db3e0a514cc64f307c4e38b33c34eb301901ac08adca1b2c34d847cbd7e
MD5 0cfe0e22f2c4db5d8ab9dd91e1e614b9
BLAKE2b-256 4d4f3e91e43b36b44f985ea88887f3ddb03ee93354545ec377c31dc27b18e3c1

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 6a67a6429aa46c5c076e06bfc8004b63cd9ec633b788038803e36f296909b3d7
MD5 c674ae673798f612c2a5d13a79ae325e
BLAKE2b-256 302a2239a97edc5c71ad40bee2f55698b40de5cb40f4d812fd069dbc3fdb6dc5

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 67abdf1eae77aedcb228992da1b772b359cd8340c6397fedf4045dbbb9256f52
MD5 c78a6337d449db233efbf59c2278455f
BLAKE2b-256 e5e78c77222b9dfd56fd7d428841bd168d06f196eaab36eabafead561156cf77

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 2425197cca73aae415c44bec8618d70e7dac79ecd556bd2d8a1c50ff4f63b160
MD5 62620a60329a78d1c6eca6f518b67a98
BLAKE2b-256 d9ffea47bc4c8821dbebb428654e41bb780399829d75257177e6138b294c82fc

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 3abfbd1a632c2bea64486068d53d14a3709c228193e77413fdb9a0767e325e1b
MD5 3ea7984b63758cb86069544e554150a9
BLAKE2b-256 bc5e6f1ae760c9fbd2fbccec3d4f7d06e3498b5d7a470d0ba38706f9d44dc66f

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp38-cp38-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 6366097370174111de5f95f82bd8afa1d95c12789c7a6c32ca64e1c077e1f533
MD5 d2b8c780c516dcaec6404ae34d2073d9
BLAKE2b-256 4796a9eee56f9d2913f9bc30639ff61b50292db218f7ebec8398536d732e2ed4

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e139b8d1dec542bb3f3bc0791b51ea48f2a5c24524611a8d424454ef9b7804f2
MD5 91a9585a49af6c104958695fb90f837f
BLAKE2b-256 b2d6bbda1d2fc2271dd6c1fbb6706ffa2109310451ee0b6b3cdb2edb24bdb587

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 fc6b57254f67c9db06c4c42128fba11de8de29312cddbe500cefd8759bcf3f6f
MD5 fb38efd75199bd1fe297e1449dd9d7f6
BLAKE2b-256 a764391a882a62cddf6a4e2bc56c1225daf9f5dd94e23e8e4279401bd4b49e3e

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 c16880b4738a517e6bf2cb2964920d02ec362ed474f11121202eaf287323f9a7
MD5 74a18a3e1a5feb014515d32372247b1b
BLAKE2b-256 c0fdc5545270809c4e5307c7f9a8024271a7ed77e5713cdd669d792f1c803673

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 3751ac55ecbce0b273492d98eec9d9deb6e2afa6a2ac7e4b052999b0adccdd5a
MD5 27d6b6f2d4ab0bc3415d6c364c02bec0
BLAKE2b-256 04b62fe4df4add516bf6ad429a30f43eb6531c7897e8708e8431ff2825dd2643

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp37-cp37m-win_amd64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 3e1f191278306d0f3f8ae18aea4ef92d5f58ce52aba6ff435f0f2a924b105a2b
MD5 5333951965c4b27f065848262180fb5e
BLAKE2b-256 33519486cf6aa7d37c3658f5bf90e05bd73bf3ab59d7fad2b262279f95629aad

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp37-cp37m-musllinux_1_1_i686.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 e3ab815db17bf4994bc98d3e97bffb27ccd681fa43567f2ea8b2477f609c62f3
MD5 b5134bca8607138e79753cb89dcd4554
BLAKE2b-256 105484140a9c1f37d1a2f9f9c6b448da98f191083787094ccb5232deb36890f9

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1a5ca1d8dcd8cd8812ac59cf5c15dc19cda7f536a097d942aa3d8f78af187c46
MD5 b0623973a6d7001d80507a6f61916ab4
BLAKE2b-256 ea80e85470d4a040ef05b2df4f8d645d0e440f95ace6760973ebca085e04f66f

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 724e9b1a98061f03b1153181dd0d30d786bfe60f40b70e501e22d8948dbdf1fe
MD5 5c68edfbf28a03ceb4d0c9ace41eae89
BLAKE2b-256 225849488a9525e6b02823ca09a11c58d278a850ed5af82a05fc2704a728874d

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 5c47107667bfeab3b6f1ed74cfb05f325f389c250e850de8d38a5ba7fe16018c
MD5 e0c458808fbd5e1e0700f512e4d59907
BLAKE2b-256 618cc704c306b7c3f65c22929719424b52c09aa25a7937c6d6fb963c781bf33d

See more details on using hashes here.

File details

Details for the file DLite_Python-0.4.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl.

File metadata

File hashes

Hashes for DLite_Python-0.4.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 bde7bdf91502d8273f83aa227d7dabe7830bd7b9f7b0a12453d9431bf9db168c
MD5 391f08db9229a084f34a0bccc13891e2
BLAKE2b-256 e067275e996dba8160327d163a6245e6df8808549c425790e1e1373c14e2eeda

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page