There is no rule for what a "good game engine" should contain. If you create your own engine, you decide what it is there for and what is required. Take the Unity engine for example (it is a really well designed and feature-rich universal 3D game engine). It does most everything you will need to make any kind of game:
- Any kind of Graphics
- User Input
- 2D / 3D Audio
- Asset Management and Distribution
You can do almost any game with it. Then look at the Source Engine by Valve. The type of game you can create with it is kind of limited. I don't know if it is entirely impossible, but that engine is not intended for anything except FPS games.
You see, you have to decide what you game engine should do and what it has to include. You probably have a reason for making your own engine (apart from the learning effort), so stick to that goal. You want a universal game engine? Try to look at other (commerial and FOSS) engines and see what they do for the developer. You want something special (e.g. an engine for 2D turn-based roguelike games)? Cut down on the feature list and don't do stuff you don't need.