One of the included examples for a "custom" service is alarm.py included in the examples directory.
Mar 13 08:10:44 raspberrypi weewx[18326]: **** engine = engine_class(config_dict)
Mar 13 08:10:44 raspberrypi weewx[18326]: **** File "/home/weewx/bin/weewx/engine.py", line 77, in __init__
Mar 13 08:10:44 raspberrypi weewx[18326]: **** self.loadServices(config_dict)
Mar 13 08:10:44 raspberrypi weewx[18326]: **** File "/home/weewx/bin/weewx/engine.py", line 141, in loadServices
Mar 13 08:10:44 raspberrypi weewx[18326]: **** self.service_obj.append(weeutil.weeutil._get_object(svc)(self, config_dict))
Mar 13 08:10:44 raspberrypi weewx[18326]: **** File "/home/weewx/bin/weeutil/weeutil.py", line 1132, in _get_object
Mar 13 08:10:44 raspberrypi weewx[18326]: **** mod = __import__(module)
Mar 13 08:10:44 raspberrypi weewx[18326]: **** ImportError: No module named alarm
Mar 13 08:10:44 raspberrypi weewx[18326]: **** Exiting.
The alarm module is present in the examples directory and my configuration points to examples.alarm.MyAlarm in the report_services section