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

If you have Pint installed, you can also specify or access the age as a quantity with unit

>>> homes.q.age = "34year"
>>> homes.q.age
<Quantity(34, 'year')>
>>> homes.q.age.to("century").m
0.34

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.5.1.tar.gz (17.5 kB view details)

Uploaded Source

Built Distributions

DLite_Python-0.5.1-cp311-cp311-win_amd64.whl (378.1 kB view details)

Uploaded CPython 3.11 Windows x86-64

DLite_Python-0.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

DLite_Python-0.5.1-cp310-cp310-win_amd64.whl (377.9 kB view details)

Uploaded CPython 3.10 Windows x86-64

DLite_Python-0.5.1-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.5.1-cp39-cp39-win_amd64.whl (377.9 kB view details)

Uploaded CPython 3.9 Windows x86-64

DLite_Python-0.5.1-cp39-cp39-musllinux_1_1_i686.whl (403.9 kB view details)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

DLite_Python-0.5.1-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.5.1-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.5.1-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.5.1-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.5.1-cp38-cp38-win_amd64.whl (377.9 kB view details)

Uploaded CPython 3.8 Windows x86-64

DLite_Python-0.5.1-cp38-cp38-musllinux_1_1_i686.whl (403.9 kB view details)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

DLite_Python-0.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.0 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

DLite_Python-0.5.1-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.5.1-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.5.1-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.5.1-cp37-cp37m-win_amd64.whl (376.6 kB view details)

Uploaded CPython 3.7m Windows x86-64

DLite_Python-0.5.1-cp37-cp37m-musllinux_1_1_i686.whl (404.6 kB view details)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

DLite_Python-0.5.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (16.0 MB view details)

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

DLite_Python-0.5.1-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.5.1-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.5.1-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.5.1.tar.gz.

File metadata

  • Download URL: DLite-Python-0.5.1.tar.gz
  • Upload date:
  • Size: 17.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for DLite-Python-0.5.1.tar.gz
Algorithm Hash digest
SHA256 6d444ea4ce6608a4071e10fe239b442d1b435c4f67332dffc678904f45093bbc
MD5 1d00481e903234eb992fbdf2e7af6f61
BLAKE2b-256 9f17f0298f2bb29a4bd7794db782815fa240366cad6637b9f519ef72b74251d2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b5e95743bab29720b4b903a45b4ad5ad0f86a15ff8f8c3e0a90c6036d0ed1fb9
MD5 5fbb24bfba1c5db24dc54b6352b4e893
BLAKE2b-256 6783f3d630257705d57d2d67c401d3caff74cca86c8bfe4d11c31a4a93007d78

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 36c690923faff774c41c4ed161e6e1eed67bd21de0e49ce6c0430290deb5d16a
MD5 1144094b9c4875cca47ab3dffb9c3a04
BLAKE2b-256 18fa911f55fc67bdabb0d1ecd1a8b97b78fe93ba989edb8f22cd06015d27b0b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6bb1729ea625e8e7f09713920e29e47c5eb8a510504df0c129093fcfb1558af2
MD5 df14bd03befef58e568642849e28739d
BLAKE2b-256 219e7b3bb13138098f0171dfdfd0c35afac4e7b81011f0e220bcc5d92679453c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1e848583ccb4fab8c8e6bd189f84cad235f03d68a9cbe11772a8e0a9bf483247
MD5 a733f5671f96bbafe1d66d0b4d0e6cdc
BLAKE2b-256 ef479171da2a1fe041f60615cad16ee5d488b4551e7dad43d4b8f42dfb555aa5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 e4c6d3fc3049c8824565d6fd7c8ffa8475ef2b4295418013761c237ed0c07fa1
MD5 4327b268b16850e07966100cc54f3d9e
BLAKE2b-256 ec4a931254d1384e51268bcf6bd5a424f118c0c8eb163268ba44d1d845eb27d0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp39-cp39-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 2fd85cc2cb53fe45a9b8a342e6d109c4574ba6449f5fd9be8abcc3e0fcf926cf
MD5 dd749c4d31efd5a131bface8acfd3e10
BLAKE2b-256 3e735cef36799950917df3239e71dc9f2c6c523caf7debdf7847977f07322dea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ffb68a57656caaddf40070dd7250f094f77516c6666db6442c9e4e0f84c3380a
MD5 e21a1fbfe7db826fb186cd52e35e6a1d
BLAKE2b-256 5a07b8770344d2fdb152d88109338eed28f70366aedcc269019bf6bd0ce843ae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 54f51f5b97478fce0754e54c9f58e442db9250da477a44b5900de4009ac0871a
MD5 426325cd48ef9ffeabf24d3eabb4249f
BLAKE2b-256 0945ef115fbeafef82169813db461ddf82cd866e99d7445f55508cb91e3772f0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 17873d018781e139528d70b812905ce7e5cf322a6d0cc7f8c4f7cedc8721cf8f
MD5 c22f7231991b7d6e6909a05d9826d317
BLAKE2b-256 d20b8aaeb1c947f2d85de0eff467093a3da258ef4cdd04d772e885711e56d71d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 796b219147b4272be05ad7d717f73065e41a082311097b998866559add2b53c6
MD5 77ba400770365dd5f0f1de33c1ef15bb
BLAKE2b-256 57c71046b9edd1097f2ab44e3c0d9acf8d1da2ba42b12a900908d2f75843232b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 9d72c3d16c0f0c9e6b3d945ee6704564338b3a02e235eb6c9b638bdf83a8b320
MD5 3cf85badbd935e37d15aa42c709f9c40
BLAKE2b-256 2646caaf5403a8e0195c9a116104ef2dfa8d8e39380319883f72624d1eca8b56

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp38-cp38-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 78859822992a8b686dc6fce456eead8dbeaa3865a921e6f474a4ad26a499f044
MD5 c52fa4ee79064add5958dd6857529cd6
BLAKE2b-256 795e5e6f630a9cea237c0896cdf2718bd31d685b5921b72f670c62fee321e38c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2e9e831695d00bb1c207a89a401f4768c13ba1138fb7404910188e58fd2a68f9
MD5 487736d7b2f25d568b08724ff92b8938
BLAKE2b-256 71eb46a9e05c815ae758f600bb94ce6cb82f153bde7c05a878f0301216ff7502

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 57265706e42c841f70fb4b07f4c35d33ce30056e14ba534dc22a8ea0ef209660
MD5 75246ca6551b89b312357d538195d4b1
BLAKE2b-256 c4df0c0ef7389cbb8a379a17723ab05dc6f080050b1e0199f08d327736a452fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 d91eb66f86e94c1ffdbc2c5b5ca90932480c4453f75ddc5c5d11051438cf3bdc
MD5 2ae967af01587fc2a6396d9c7c470bc7
BLAKE2b-256 74b0caf2f2c7558161afee667fb6886cd62e445452f7e69b1f692e4dea9ad8fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 ff727a976069da6ca8d10c8dbd3d02247a6c8a5642a61e9c3836eb2680ebbf59
MD5 f042b9f8ea5076886fb4bf2e039c85cd
BLAKE2b-256 c43dafbe34e4f1b09d35538bb396459877574dd6543826caa9d1a095539d17be

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 cc88fdbac4afc60df976ec2a099f69ca1b31222ee57b4749eb180a0bc8ee0864
MD5 f497c16dc7fb0bc6375e89c2a09cd6b7
BLAKE2b-256 4481a3b579ea6d77fb4ac1209701e08e3d7b2ce016df820b7735711750195fe8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp37-cp37m-musllinux_1_1_i686.whl
Algorithm Hash digest
SHA256 eac669ae29798b55e53a00adba17af622aa9f16f3ba5c7f3e0e870e8bb073fbc
MD5 cc9a764f88a2643d0f856cce74436ff5
BLAKE2b-256 5c4d52a2232d07f84da00408893fd0350ee5575c7cf5e4c466bacb70cf59a2e9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5e7fc53b0fe76a386719c859eb588b0cc90ace30cde5ca3745e743c7f60d433c
MD5 2df8bf08d8c64571633bca94481589cd
BLAKE2b-256 ba89cefccf1bcc44b54056cd20ce1e786aa60de8b53be7d32593cd6342a1b685

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 1b98dbd65f7acae1e627e28ca0054759630867e3f63ce1ebefcdc3ae83df1de3
MD5 1c6b220a7ebe62b0ea63d61583490503
BLAKE2b-256 ae4a5bff38bd5000ba4dfefe0438fea47272859d453a22e2df6a85f0575906a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 197f762a48f9b52a96392fdd6bddfa2d6a595c5a150a2f046d50cf96ba667636
MD5 f9e32872c5f53621ca9a90df3e79987e
BLAKE2b-256 1a1f166b456cd9be1be13b35a03f7ca77bce6a810ba8c92192cf17029eba89d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for DLite_Python-0.5.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl
Algorithm Hash digest
SHA256 2073a0bd6beedf03b0f35574c2602187791955bdb7ac82be9509cceb64b6a4a8
MD5 ad45017c4951f53a075440ada56d16a3
BLAKE2b-256 db77f3b290240c9e57e4ea45a2bbf5ac12dcf6f904b641d85fc22e2775ff6a97

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