freckle-app

Haskell application toolkit used at Freckle.


CHANGELOG | LICENSE

Changes

Unreleased

v1.7.0.0

  • Add XRay and EKG support to freckle-app’s runDB.

    This involves an breaking change in runDB’s constraints, thus the major version bump.

v1.6.0.3

  • Revert regrouping of SqlError by url

    Consider /foos/1 vs /foos/2: grouping naively by url makes these two errors when we wanted them to be one. This can’t be solved without knowledge of the routing system, so we can’t do it from within this library as-is. Therefore, we’ve reverted the feature for now.

v1.6.0.2

  • Strip query string from URLs used to group timeout exceptions in Bugsnag.

v1.6.0.1

  • The built-in Bugsnag BeforeNotify will further group SqlErrors that are timeouts (57014) by Request URL (when request info is present in the Event)

v1.6.0.0

  • Remove AppVersion

    This also removes the test-git flag.

    This was over-engineered, in our opinion. If you’re making use of the conventional DD_ variables that the Stats module expects, you should be able to:

    • Replace any appVersion :: AppVersion with appVersion :: Text
    • Replace appVersion <- getAppVersion with appVersion <- maybe "unknown" pack <$> lookupEnv "DD_VERSION"
    • Replace avName appVersion with appVersion
    • Remove uses of avCreatedAt
  • Add Freckle.App.Dotenv, wrapping dotenv

    And move Freckle.App.Test.withApp to use it instead of LoadEnv. This is behavior-neutral except:

    • We no longer load .env after .env.test, we only load .env.test

      Missing variables should generate errors prompting you to copy values from the former to the latter as required.

    • We will verify the .env file against an .env.example if present.

  • Add Freckle.App.Bugsnag.Metadata

v1.5.0.1

  • Export Freckle.App.Stats.tagsL

v1.5.0.1

  • Relax lower bound on primitive

v1.5.0.0

  • Remove Freckle.App.Datadog modules for Freckle.App.Stats equivalents

    It’s not a drop-in, but the required changes should be mechanical:

    • Instead of HasDogStats{Client,Tags}, implement a single HasStatsClient
    • Instead of mkStatsClient use withStatsClient (the new style of runApp had will enable that)
    • Use tagged instead of extra arguments to metric sends
    • Move to the new Rts, Gauge, and Middleware.Stats modules
  • Change signature of runApp and withApp

    Instead of passing a loaded App (or a function that loads an App) to runApp and withApp, you should now pass a function that takes a function and calls it on the loaded App.

    This is necessary for apps that hold onto values that require cleanup, like withStatsClient.

    -- This doesn't work
    loadApp :: IO App
    loadApp = do
      -- ...
      withStatsClient $ \appStatsClient -> do
        -- ???
    
    -- This does
    loadApp :: (App -> IO a) -> IO a
    loadApp f = do
      -- ...
      withStatsClient $ \appStatsClient -> do
        f App { .. }
    

    The old form can be trivially converted to the new form like so,

    loadApp :: (App -> IO a) -> IO a
    loadApp f = f =<< loadApp'
    
    loadApp' :: IO App
    loadApp' = -- old code
    
  • Add functions that check properties that we like to commonly test.

v1.4.0.0

  • Remove runCapturedLoggingT

    We can use Blammo.Logging.Logger.newTestLogger instead. See MemcachedSpec as an example.

  • Compatibility down to LTS 12.26 / GHC 8.4

v1.3.0.0

  • Adjust Freckle.App.Test interface
    • Remove runAppTest
    • Add appExample for making a expectation concretely AppExample
    • Add expectationFailure, and pending(With) helpers in MonadIO

v1.2.0.2

  • Env.kept compatibility with envparse-0.5

v1.2.0.1

  • Use Env.kept with parsing that occurs in makePostgresPool

    This ensure all PG variables are kept in the environment after parsing, to again match pre-v1.1 behavior.

    If you would prefer not to keep these variables, parse them yourself (e.g. with envParseDatabaseConf) and use makePostgresPoolWith.

  • Add Freckle.App.Env.kept to re-define a Parser so that all variables are kept after reading. Not doing this can break tests if you are re-parsing the environment for each example.

    Replace Env.parse f with Env.parse f $ Env.kept to recover how this module behaved prior to v1.1.

v1.2.0.0

  • Remove Freckle.App.Logging, integrate with blammo instead.

    This will require the following end-user changes:

    • Remove HasLogging instance and add HasLogger

      This will require storing a Logger on your runtime App type, instead of a LogLevel (et al) in your static AppSettings type. (Or move to runSimpleLoggingT.)

    • Replace WAI middleware with Blammo integration

    • Replace Yesod functions with [Blammo integration][blammo-yesod]

    And changes to environment variable values:

    • If using LOG_OUTPUT=std(out|err), use LOG_DESTINATION=std(out|err) (note that stdout is the default)
    • If using LOG_OUTPUT=file, use [email protected] (yes, that’s this option did)
    • If using LOG_FORMAT=terminal, use LOG_FORMAT=tty (note that this is the defualt)

v1.1.0.0

  • Require MonadLoggerIO in makePostgresPool (and so respect that logging context from DB activities).

    Previous behavior can be recovered by using runNoLoggingT makePostgresPool.

  • Re-implement FronRow.App.Env via external library, envparse

    Some conversions will be required:

    • Reader a should now be Reader Error a

    • Parser a should now be Parser Error a

    • parse should now be parse id

    • var x X nonEmpty should now be var (x <=< nonempty) X mempty

      Note that (str <=< nonempty) is redundant.

    • var (f <$> g) X m should now be f <$> var g X m

      Note that def will now need a value the same type as g, not f.

    • switch and flag no longer accept def (the non-active value is an implicit default; the previous behavior was kind of surprising and ambiguous).

    • handleEither has been removed. Users will have to parse a complete value and then further validate/throw externally.

    • Previously, we always behaved as if keep was applied. Add that explicitly if you need that behavior.

v1.0.4.0

  • Add Freckle.App.Bugsnag for Bugsnag logging in applications.
  • Increased default PG poolsize to 10.

v1.0.3.0

  • Add Freckle.App.Memcache for using memcached in Apps
  • Add Freckle.App.Scientist for using scientist in Apps

v1.0.2.10

  • Support GHC 9.0 and 9.2

  • Change Wai function arguments for producing RouteName and TraceId to tags

    To maintain the same behavior, replace

    makeLoggingMiddleware app getRouteName getTraceId ...
    

    With

    makeLoggingMiddleware app getTags ...
      where
        getTags req = catMaybes
          [ ("route", ) <$> getRouteName req
          , ("trace_id", ) <$> getTraceId req
          ]
    

    And similar for makeRequestMetricsMiddleware.

v1.0.2.9

  • Add some common textual encoding functions to prelude

v1.0.2.8

  • Don’t allow aeson-2.0

v1.0.2.7

  • Remove explicit --region in IAM DB token call
  • Relax lower-bounds throughout

v1.0.2.6

  • Add a looser lower-bound on containers

v1.0.2.5

  • Add a looser lower-bound on bytestring
  • Add a looser lower-bound on template-haskell

v1.0.2.4

  • Add a looser lower-bound on base

v1.0.2.3

  • Add Freckle-specific prelude.

v1.0.2.2

  • Target hspec-junit-formatter-1.0.3.0 (use 1.1.0.0 in development)

v1.0.2.1

  • Add denyFrameEmbeddingMiddleware for denying HTML frame embedding.

v1.0.2.0

  • Add ‘Freckle.App.Yesod.Route’ to allow printing route names.

v1.0.1.0

  • Added Freckle.App.Datadog.Gauge for client side stateful gauges.
  • Added Freckle.App.Datadog.Rts for sending RTS statistics to DataDog.

v1.0.0.4

  • Support seconds or milliseconds in PGSTATEMENTTIMEOUT

    NOTE: We consider this a non-breaking change because the environment variable interface is backwards-compatible. By normal Haskell rules, it would be major since it’s changing the type of something exported.

  • Add respondQueryCanceled Yesod Middlewares

  • Add makeRequestMetricsMiddleware

v1.0.0.3

  • Add package.yaml to extra-source-files.

v1.0.0.2

  • Extract tests that require git into a new suite.

v1.0.0.1

  • Ensure release GitHub Action completes properly.

v1.0.0.0

First tagged release.